全部,我有一个方法调用IProgress<T>.Report();
来更新我的UI并进行相关的数据选择。后台线程随后通过与其一起工作的接口获取当前选择(在UI上)。因此,重要的是IProgress<T>.Report();
调用阻止返回,直到进行UI更新。 MSDN未提供Report();
方法的这方面的信息......
Report();
方法是否会阻止返回后台线程,直到Report();
委托被冻结?
感谢您的时间。
答案 0 :(得分:6)
不,它没有。它posts - 而不是发送 - 到同步上下文。帖子是异步的。
请注意,这是一个实施细节。我是从阅读代码中学到的,我不知道有关于此的任何官方文档。
此外,SynchronizationContext.Post
应该是异步的,但不能保证是异步的。例如,在ASP.NET中,可以直接调用委托,即同步 Reference: See Figure 4 。
答案 1 :(得分:5)
这完全取决于您使用的IProgress<T>
的实施情况。如果您要使用内置Progress<T>
,则Report()
不会等待委托/事件处理程序完成。
您可以创建自己的IProgress<T>
实现,它可以执行您想要的操作(最有可能调用SynchronizationContext.Send()
)并使用它。
但我不确定这是一个好的设计,我认为你的工作代码不应该依赖于必须在GUI线程上进行的计算。您可能想考虑改变您的设计。