IProgress <t>等待/阻止,同时更新UI </t>

时间:2013-01-31 12:04:00

标签: c# .net-4.5 async-await progress

全部,我有一个方法调用IProgress<T>.Report();来更新我的UI并进行相关的数据选择。后台线程随后通过与其一起工作的接口获取当前选择(在UI上)。因此,重要的是IProgress<T>.Report();调用阻止返回,直到进行UI更新。 MSDN未提供Report();方法的这方面的信息......

Report();方法是否会阻止返回后台线程,直到Report();委托被冻结?

感谢您的时间。

2 个答案:

答案 0 :(得分:6)

不,它没有。它posts - 而不是发送 - 到同步上下文。帖子是异步的。

请注意,这是一个实施细节。我是从阅读代码中学到的,我不知道有关于此的任何官方文档。

此外,SynchronizationContext.Post应该是异步的,但不能保证是异步的。例如,在ASP.NET中,可以直接调用委托,即同步 Reference: See Figure 4

答案 1 :(得分:5)

这完全取决于您使用的IProgress<T>的实施情况。如果您要使用内置Progress<T>,则Report()不会等待委托/事件处理程序完成。

您可以创建自己的IProgress<T>实现,它可以执行您想要的操作(最有可能调用SynchronizationContext.Send())并使用它。

但我不确定这是一个好的设计,我认为你的工作代码不应该依赖于必须在GUI线程上进行的计算。您可能想考虑改变您的设计。