【问题标题】:async await suitable to my case?async await 适合我的情况吗?
【发布时间】:2014-09-15 17:06:54
【问题描述】:

我有一个 winform 应用程序,它有一个数据库操作。而不是默认的UI阻塞效果,我希望显示一个像

这样的特殊形式

System is processing. please wait

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

我想知道这个场景是否可以用新的 async/await 机制来实现。我怀疑。

【问题讨论】:

    标签: winforms asynchronous block async-await


    【解决方案1】:

    您所说的阻止 UI 并不是阻止 UI。阻塞 UI 线程意味着停止消息处理,以便 UI 无法更改并对输入做出反应。如果检测到这种情况,窗口通常会被 Windows 重影。

    您想显示一个模态对话框。您可以使用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 线程上多路复用。线程安全不是问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 2012-01-21
      • 1970-01-01
      • 2017-09-08
      • 2019-12-04
      • 1970-01-01
      相关资源
      最近更新 更多