【问题标题】:Does IProgress<T> Wait/Block Whilst Updating the UIIProgress<T> 是否在更新 UI 时等待/阻止
【发布时间】:2013-01-31 12:03:59
【问题描述】:

所有,我有一个方法调用IProgress&lt;T&gt;.Report(); 来更新我的 UI 并进行相关的数据选择。后台线程随后通过与它一起工作的界面获取当前选择(在 UI 上)。因此,在进行 UI 更新之前,IProgress&lt;T&gt;.Report(); 调用会阻止返回,这一点很重要。 MSDN 没有提供关于 Report(); 方法这方面的信息...

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

感谢您的宝贵时间。

【问题讨论】:

  • 是的,我明白了。但快速回答可以节省我 15-20 分钟的测试时间……此外,更完整的回答将帮助我了解报告机制的基本工作原理……

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


【解决方案1】:

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

请注意,这是一个实现细节。我是通过阅读代码了解到的,我不知道有任何关于此的官方文档。

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

【讨论】:

  • 不一定要那样做,要看IProgress的实现。
  • 我的意思是别的:您可以创建自己的 IProgress 实现来做其他事情,您不必使用 Progress
  • @svick:没错。显然,我假设 OP 询问的是迄今为止存在于 .NET 框架中的该接口的唯一实现。为什么要反对投票是我无法理解的。
  • 我同意,我认为这里没有必要投反对票。这我的问题的答案...
  • @DanielHilgarth 我认为,如果您假设问题中没有实际说明的内容,那么您应该明确地说出来。事实上,我认为这个答案具有误导性。
【解决方案2】:

这完全取决于您正在使用的IProgress&lt;T&gt; 的实现。如果您要使用内置的Progress&lt;T&gt;,那么Report() 不会等待委托/事件处理程序完成。

您可以创建自己的 IProgress&lt;T&gt; 实现来执行您想要的操作(很可能调用 SynchronizationContext.Send())并使用它。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多