【问题标题】:Keep UI thread going while waiting for a delegate to finish?在等待委托完成时保持 UI 线程继续运行?
【发布时间】:2014-05-20 17:21:45
【问题描述】:

在我的代码中,我使用BeginInvoke 来触发委托(从文件中加载一些配置)。我希望我的 UI 保持响应,所以我认为这样做会起作用:

  LoadConfig lc = new LoadConfig(doLoadConfig);
  IAsyncResult asyncResult = lc.BeginInvoke(null, null);
  while (!asyncResult.IsCompleted)
  {
    asyncResult.AsyncWaitHandle.WaitOne(500, false);
  }
  asyncResult.AsyncWaitHandle.Close();
  bool bLoadResult = lc.EndInvoke(asyncResult);

问题是它挂在等待位上。有什么方法可以让我等待我的委托完成,同时保持 UI 线程处于活动状态(有点像在 .NET 4.5 中使用 async/await)?

我正在使用 .NET 3.5 BTW。

【问题讨论】:

  • 参考《异步调用完成时执行回调方法》here
  • 那么回调是我唯一的选择吗?

标签: c# multithreading user-interface asynchronous delegates


【解决方案1】:

那么回调是我唯一的选择吗?

我知道使用DoEvents 进行轮询很诱人,但那是错误的。为了保持 UI 响应,您需要返回到 UI 线程消息循环。即,您必须从当前方法返回,并在将来触发完成事件时异步(通过回调)处理完成事件。

在 C# 5.0 中,有async/await 来解决回调地狱问题。在早期版本中,您可以利用 yield 关键字,例如 this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2018-05-28
    相关资源
    最近更新 更多