IProgress在更新 UI 时是否等待/阻止
本文关键字:是否 等待 阻止 UI 更新 IProgress | 更新日期: 2023-09-27 17:56:44
All,我有一个调用IProgress<T>.Report();
来更新我的UI并进行相关数据选择的方法。后台线程随后通过使用它的界面获取当前选择(在 UI 上)。因此,在进行 UI 更新之前,IProgress<T>.Report();
调用阻止返回非常重要。MSDN 没有提供有关Report();
方法的这一方面的信息...
Report();
方法是否阻止返回到后台线程,直到Report();
委托被关闭?
谢谢你的时间。
不,它没有。它发布 - 而不是发送 - 到同步上下文。帖子是异步的。
请注意,这是一个实现细节。我从阅读代码中学到了它,我不知道任何关于此的官方文档。
此外,SynchronizationContext.Post
应该是异步的,但不能保证是异步的。例如,在 ASP.NET 可以直接调用委托,即同步引用:见图4。
这完全取决于您正在使用IProgress<T>
的实现。如果要使用内置Progress<T>
,则Report()
不会等待委托/事件处理程序完成。
您可以创建自己的IProgress<T>
实现,该实现可以执行所需的操作(最有可能调用SynchronizationContext.Send()
)并使用它。
但我不确定这是一个好的设计,我认为你的工作代码不应该依赖于必须在 GUI 线程上进行的计算。您可能需要考虑更改设计。