异步等待适合我的情况?

时间:2014-09-14 13:38:29

标签: winforms asynchronous block async-await

我有一个winform应用程序,它有一个数据库操作。我希望显示一个特殊的表单,如

,而不是默认的UI阻止效果

System is processing. please wait

告诉用户系统正在运行。所以基本上我并不是在寻找真正的响应式用户界面。我仍然想阻止UI。我已经使用backgroundworker组件实现了这个目标。连接完成的回调,然后在按钮单击事件处理程序中调用RunWorkerAsync,showdialog处理表单。然后在完成的回调中,关闭处理表单。

我想知道是否可以使用新的async / await机制实现这种情况。我对此表示怀疑。

1 个答案:

答案 0 :(得分:2)

您所谓的阻止UI的行为并未阻止UI。阻止UI线程意味着停止消息处理,以便UI不能更改并对输入作出反应。如果检测到这个窗口,窗口通常会被幻影显示。

您想要显示模态对话框。您可以使用BackgroundWorker或使用asyncawait以更现代的方式执行此操作。例如:

void MyClickHandler(...) {
 var form = new MyForm();
 Task myAsyncOperation = StartOperationAsync(form);
 form.ShowDialog();
 await myAsyncOperation;
}

async Task StartOperationAsync(Form formToClose) {
 await DoSomething();
 formToClose.Close();
}

所有这些代码都在UI线程上进行了多路复用。线程安全不是问题。