等待 IProgress 报告方法返回

本文关键字:返回 方法 报告 IProgress 等待 | 更新日期: 2023-09-27 18:37:05

我正在通过IProgressReport方法更新我的UI。我做类似的事情

IProgress<ProgressInfo> p = new Progress<ProgressInfo>(ReportProgress);
Task task = Task.Factory.StartNew(() =>
{
    result = Execute(p);
});

Execute方法中,我通过以下方式报告进度

p.Report(someObject);

现在,问题是,在向 UI 报告进度的最后一种情况下,我向控制台窗口写入一些内容,在任务返回时使用。问题是,由于IProgress是异步的,因此任务会在最后一个进度报告未完成时返回,从而使我没有数据。

我显然可以让线程进入睡眠状态或旋转等待,但这对我来说似乎很讨厌,因为尽管报告过程需要很短的时间,但我不知道睡眠等的实际价值。我已经考虑过使用AutoResetEvent但同样不确定这是最干净的解决方案。

我的问题是,我如何强制线程以尽可能"干净"的方式等待p.Report(someObject)调用的返回,即不依赖于猜测报告进度返回的时间?

等待 IProgress 报告方法返回

Progress<T> 类使用 SynchronizationContext 以异步方式调用报告处理程序。这样做是为了更新 WPF 或 WinForms 中 UI 线程上的 UI。如果这不是您想要的(控制台应用程序中显然不需要它),请不要使用 IProgress<T> 接口,或者以同步方式自行实现它:

  1. 转到 ReferenceSource 并将代码复制到项目中。

  2. 取代

    m_synchronizationContext.Post(m_invokeHandlers, value);
    

    m_synchronizationContext.Send(m_invokeHandlers, value);