在等待委托完成时保持UI线程的运行?

时间:2014-04-08 07:00:28

标签: c# multithreading user-interface asynchronous delegates

在我的代码中,我使用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。

1 个答案:

答案 0 :(得分:0)

  

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

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

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