在我的代码中,我使用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。
答案 0 :(得分:0)
那么回调是我的唯一选择吗?
我知道使用DoEvents
进行投票很有诱惑力,但那是错误的。要保持UI响应,您需要回退到UI线程消息循环。即,您必须从当前方法返回,并在将来触发时,异步处理完成事件(通过回调)。
在C#5.0中,有async/await
来解决回调地狱问题。在早期版本中,您可以使用yield
关键字,例如this。