c# WPF多线程不能从Dispatcher返回实际值.VS2013中的BeginInvoke

本文关键字:VS2013 中的 BeginInvoke 返回 多线程 WPF 不能 Dispatcher | 更新日期: 2023-09-27 18:19:14

我想从c# VS2013 WPF中获得一个线程的返回值。

代码是:

int t = 0;
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
    t = myFucntion(myObject) // if I do not use dispatcher, myObject cannot be accessed by the calling thread. 
));
return t;

为什么t总是0而不返回实际值?这里的解决方案对我不起作用。

WPF Dispatcher调用返回值始终为空

Application.Current.Dispatcher.Invoke((() =>
        {
          t = myFunction(myObject));
        }));
return t;

但是,t没有赋值给myFunction返回的实际值

c# WPF多线程不能从Dispatcher返回实际值.VS2013中的BeginInvoke

Dispatcher.BeginInvoke是异步的。它将在委托排队到消息循环后立即返回:

在指定的时间异步执行指定委托Dispatcher关联的线程的优先级。

这意味着您有一个竞争条件,您甚至可能看到t实际上包含期望的值,如果您运行它足够多次的话。

为了消除这种情况,如果您想等待直到委托在消息循环中运行,请使用Dispatcher.Invoke代替:

Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, 
                                      new Action(() => t = myFunction()));