等待IProgress报告方法返回

时间:2015-01-09 14:16:41

标签: c# multithreading asynchronous task .net-4.5

我正在通过IProgressReport方法更新我的用户界面。我喜欢

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

Execute方法中,我通过

报告进度
p.Report(someObject);

现在,问题是,在我向UI报告进度的最后一种情况下,我将一些内容写入控制台窗口,我在任务返回时使用该窗口。问题是因为IProgress是异步的,所以当最后一个进度报告没有完成时,任务会返回,这样我就没有数据了。

我显然可以让线程进入睡眠状态或spinwait,但这对我来说似乎很讨厌,虽然报告过程需要很短的时间,但我不知道睡觉的实际值等等我看了在使用AutoResetEvent但我不确定这是最干净的解决方案。

我的问题是如何强制线程以“最干净”的方式等待p.Report(someObject)呼叫的返回,即在报告进度返回时不依赖于猜测?

1 个答案:

答案 0 :(得分:3)

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

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

  2. 替换

    m_synchronizationContext.Post(m_invokeHandlers, value);
    

    m_synchronizationContext.Send(m_invokeHandlers, value);