我正在用异步CTP进行一些探测,但由于GUI被阻塞,我没有得到好的结果。异步CTP:我做错了,GUI被阻止
我有一个WPF应用程序的按钮和文本框的日志。然后,我有这样的代码:
private async void btnAsync01_Click(object sender, RoutedEventArgs e)
{
UpdateTxtLog("Enter in Button Async01: " + System.DateTime.Now);
await metodo01Async();
UpdateTxtLog("Exit button Async01: " + System.DateTime.Now);
}
private async Task slowMethodAsync()
{
UpdateTxtLog("Enter in slowMethod: " + System.DateTime.Now);
Thread.Sleep(5000);
UpdateTxtLog("Exit slowMethod: " + System.DateTime.Now);
}
如果我没有错,设定为“同步”(在这种情况下,单击事件),它让该方法使用的await,给点返回到执行该方法的方法它调用实际的方法,然后执行返回到GUI。
所以在GUI中,我单击按钮,然后在clickMethod的click事件中等待,我如何使用slowMethod等待控件返回到GUI,然后GUI不应该被阻止。但是,图形用户界面被阻止,txtLog不显示任何信息,直到slowMethod完成。
这是因为slowMethod在与GUI相同的线程中执行吗?如果我错了,使用异步通常使用与调用await方法的方法相同的线程,但我认为异步的原因可以避免这种情况。
我该如何模拟一个没有thread.Sleep的slowMethod?也许这就是问题所在,因为在slowMethod中,我睡眠线程,而slowMethod的线程与GUI相同。
这让我觉得总是推荐在其他线程中执行异步方法的代码?如果这是正确的,如果我还需要使用任务来阻止主线程,那么使用异步的意义是什么?
何时使用异步和何时使用任务?
对于这个探头,我下面这个网站的例子:http://www.codeproject.com/Articles/127291/C-5-0-vNext-New-Asynchronous-Pattern
在这个例子中,它被用来作为client.DownloadStringTaskAsync slowMethod,但对我来说,而是采用了Web客户端,我用一个虚拟的方法,用睡眠模拟slowMethod。我认为这是唯一的区别。
谢谢。 Daimroc。