我正在使用异步 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);
}
如果没有错,设置一个带有“sync”的方法(这里是click事件),它让方法使用await,将执行点返回给调用实际方法的方法,然后执行返回GUI .
所以在GUI中,我点击按钮,然后在click事件中等待slowMethod,我如何将await与slowMethod一起使用,控件应该返回给GUI,然后GUI不应该被阻塞。但是,GUI 被阻止并且 txtLog 直到 slowMethod 完成才显示任何信息。
这是因为 slowMethod 是在与 GUI 相同的线程中执行的吗?如果我错了,异步通常使用与调用 await 方法的方法相同的线程,但我认为异步的原因避免了这种情况。
如何在没有 thread.Sleep 的情况下模拟 slowMethod?也许这就是问题所在,因为在 slowMethod 中我休眠了线程,而 slowMethod 的线程与 GUI 相同。
这让我觉得总是建议在其他线程中执行异步方法的代码?如果这是正确的,如果我还需要使用任务来不阻塞主线程,那么使用异步是什么意思?
何时使用异步以及何时使用任务?
对于此探测,我正在关注此 Web 中的示例:http: //www.codeproject.com/Articles/127291/C-5-0-vNext-New-Asynchronous-Pattern
在这个例子中,它使用了 client.DownloadStringTaskAsync 作为 slowMethod,但在我的例子中,我没有使用 WebClient,而是使用了一个虚拟方法,通过睡眠来模拟一个 slowMethod。我认为这是独特的区别。
谢谢。戴姆洛克。