等待 IProgress 报告方法 Return
Wait for IProgress Report Method to Return
我正在通过 IProgress
和 Report
方法更新我的 UI。我做了类似
IProgress<ProgressInfo> p = new Progress<ProgressInfo>(ReportProgress);
Task task = Task.Factory.StartNew(() =>
{
result = Execute(p);
});
在 Execute
方法中,我通过
报告进度
p.Report(someObject);
现在,问题是,在我向 UI 报告进度的最后一个案例中,我向控制台窗口写入了一些内容,当任务完成 return 时我会使用它。问题是因为 IProgress
是异步的,任务 returns 在最后一个进度报告还没有完成时,让我没有数据。
我显然可以让线程休眠或自旋等待,但这对我来说似乎很讨厌,虽然报告过程将花费很短的时间,但我不知道休眠等的实际价值。我已经看过使用 AutoResetEvent
但我还是不确定这是最干净的解决方案。
我的问题是如何强制线程以可能的 "cleanest" 方式等待 p.Report(someObject)
调用的 return,即当时不依赖猜测报告进度将达到 return?
Progress<T>
class 使用 SynchronizationContext
以异步方式调用报告处理程序。这样做是为了更新 WPF 或 WinForms 中 UI 线程上的 UI。如果这不是您想要的(并且您的控制台应用程序显然不需要它),则根本不要使用 IProgress<T>
接口,或者自己以同步方式实现它:
转到 ReferenceSource 并将代码复制到您的项目中。
替换
m_synchronizationContext.Post(m_invokeHandlers, value);
和
m_synchronizationContext.Send(m_invokeHandlers, value);
我正在通过 IProgress
和 Report
方法更新我的 UI。我做了类似
IProgress<ProgressInfo> p = new Progress<ProgressInfo>(ReportProgress);
Task task = Task.Factory.StartNew(() =>
{
result = Execute(p);
});
在 Execute
方法中,我通过
p.Report(someObject);
现在,问题是,在我向 UI 报告进度的最后一个案例中,我向控制台窗口写入了一些内容,当任务完成 return 时我会使用它。问题是因为 IProgress
是异步的,任务 returns 在最后一个进度报告还没有完成时,让我没有数据。
我显然可以让线程休眠或自旋等待,但这对我来说似乎很讨厌,虽然报告过程将花费很短的时间,但我不知道休眠等的实际价值。我已经看过使用 AutoResetEvent
但我还是不确定这是最干净的解决方案。
我的问题是如何强制线程以可能的 "cleanest" 方式等待 p.Report(someObject)
调用的 return,即当时不依赖猜测报告进度将达到 return?
Progress<T>
class 使用 SynchronizationContext
以异步方式调用报告处理程序。这样做是为了更新 WPF 或 WinForms 中 UI 线程上的 UI。如果这不是您想要的(并且您的控制台应用程序显然不需要它),则根本不要使用 IProgress<T>
接口,或者自己以同步方式实现它:
转到 ReferenceSource 并将代码复制到您的项目中。
替换
m_synchronizationContext.Post(m_invokeHandlers, value);
和
m_synchronizationContext.Send(m_invokeHandlers, value);