如何使用 Dispatcher.Invoke 返回值?

发布于 2024-08-26 02:05:20 字数 573 浏览 9 评论 0原文

任何人都知道如何从 Dispatcher< 返回值/code>. 中调用 ?我想返回 ComboBox

谢谢!

Anyone knows how to return a value from Dispatcher.Invoke in ? I want to return the selected index for a ComboBox.

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

街角迷惘 2024-09-02 02:05:20

还有另一种从 Invoke() 返回值的方法:

object oIsLoaded = container.Dispatcher.Invoke( new Func<bool> ( () =>
    {
        return container.IsLoaded;
    })
);

顺便说一句,初始代码(与委托一起使用)很可能根本不会修改 oIsLoaded ;所以我宁愿使用 Func< /a> 用于从此类函数返回值。

There's another way that returns value from Invoke():

object oIsLoaded = container.Dispatcher.Invoke( new Func<bool> ( () =>
    {
        return container.IsLoaded;
    })
);

And by the way, chances are that the initial code (which is working with delegate) won't modify oIsLoaded at all; So I'd rather use a Func<> for returning a value from that kind of function.

有深☉意 2024-09-02 02:05:20
int result = -1;

// this is synchronous
myCombo.Invoke(() => 
{
  result = myCombo.SelectedIndex;
});

return result;

当然,这有点笨拙。更好的设计是在虚拟机中实现 INotifyPropertyChanged,创建 SelectedIndex 属性并将组合框的 SelectedIndex 属性绑定到它。 INPC 绑定是线程不敏感的(3.5 或 4.0+,我不记得是哪一个),因此您可以放心地从 VM 中的不同线程读取和更新这些属性。

int result = -1;

// this is synchronous
myCombo.Invoke(() => 
{
  result = myCombo.SelectedIndex;
});

return result;

This is, of course, kind of clunky. Better design would be to implement INotifyPropertyChanged in your VM, create a SelectedIndex property and bind the SelectedIndex property of your combo box to it. INPC binds are thread-insensitive (3.5 or 4.0+, I don't remember which), so you can read and update these properties from different threads in your VM without worry.

热风软妹 2024-09-02 02:05:20

这是我检索组合框选定值的方法,我怎么能说委托返回值呢?

    private object getValueCB(System.Windows.Controls.ComboBox cb)
    {
        object obj;


            if (!cb.Dispatcher.CheckAccess())
            {
                obj = cb.Dispatcher.Invoke(
                  System.Windows.Threading.DispatcherPriority.Normal,
                  new Action(
                    delegate()
                    {
                        obj = cb.SelectedValue;
                    }
                ));

                return obj;
            }
            else
            {
                return obj = cb.SelectedValue;
            }

    }

This is my method to retrieve selected value for a combobox, how can I say delegate to return value?

    private object getValueCB(System.Windows.Controls.ComboBox cb)
    {
        object obj;


            if (!cb.Dispatcher.CheckAccess())
            {
                obj = cb.Dispatcher.Invoke(
                  System.Windows.Threading.DispatcherPriority.Normal,
                  new Action(
                    delegate()
                    {
                        obj = cb.SelectedValue;
                    }
                ));

                return obj;
            }
            else
            {
                return obj = cb.SelectedValue;
            }

    }
ゃ懵逼小萝莉 2024-09-02 02:05:20

你不能直接这样做,但你可以这样做。

Dispatcher.Invoke() 实际上从您调用的委托返回返回值,因此请相应地更改您的委托。

返回值

类型:System.Object 返回值
来自被调用的委托或
如果委托没有返回,则为 null
值。

来源

You can't do this directly but you can do this.

Dispatcher.Invoke() actually returns the return value from the delegate you call, so alter your delegate accordingly.

Return Value

Type: System.Object The return value
from the delegate being invoked or
null if the delegate has no return
value.

Source

半城柳色半声笛 2024-09-02 02:05:20

我已经解决了这个问题。解决方案是创建一个自定义委托,它返回所需的类型,如下所示:

    private object GetValueCB(System.Windows.Controls.ComboBox cb)
    {
        object obj = null;


            if (!cb.Dispatcher.CheckAccess())
            {
                obj = cb.Dispatcher.Invoke(
                  System.Windows.Threading.DispatcherPriority.Normal,
                  (MyDelegate)
                    delegate()
                    {
                        return (obj = cb.SelectedValue);
                    }
                );

                return obj;
            }
            else
            {
                return obj = cb.SelectedValue;
            }

    }

    public delegate object MyDelegate();

I have solved this. The solution is create a custom delegate that returns the desired type like this:

    private object GetValueCB(System.Windows.Controls.ComboBox cb)
    {
        object obj = null;


            if (!cb.Dispatcher.CheckAccess())
            {
                obj = cb.Dispatcher.Invoke(
                  System.Windows.Threading.DispatcherPriority.Normal,
                  (MyDelegate)
                    delegate()
                    {
                        return (obj = cb.SelectedValue);
                    }
                );

                return obj;
            }
            else
            {
                return obj = cb.SelectedValue;
            }

    }

    public delegate object MyDelegate();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文