c# - 等待 IProgress 报告方法返回

标签 c# multithreading asynchronous task .net-4.5

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

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

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

p.Report(someObject);

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

我显然可以让线程休眠或自旋等待,但这对我来说似乎很讨厌,因为虽然报告过程将花费很短的时间,但我不知道休眠的实际值(value)等。我看过在使用 AutoResetEvent 但我再次不确定这是最干净的解决方案。

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

最佳答案

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

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

  2. 替换

    m_synchronizationContext.Post(m_invokeHandlers, value);
    

    m_synchronizationContext.Send(m_invokeHandlers, value);
    

关于c# - 等待 IProgress 报告方法返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27862530/

相关文章:

c# - WPF DataGrid 上的双重绑定(bind)?

c# - web.config 批处理 ="false"

python - 使用具有最大同时进程数的 multiprocessing.Process

javascript - Node.js - 在继续代码之前等待多个异步调用完成

c# - RigidBody2D 卡住 X 位置

c# - 使用 asp.net 文本框进行 linq to sql 更新的问题

c - 使用 cat、tee 和 fifos 在多线程 C 程序中从 xterm 打印和读取

java - 计划任务和 Android UI

ios - 如果滚动 UITableView 时出现 popViewController,应用程序崩溃

javascript - 如何从异步调用返回响应?