Asynchronous 异步CTP:我做错了,GUI被阻止了
我正在使用异步CTP进行一些探测,但是没有得到好的结果,因为GUI被阻塞了 我有一个WPF应用程序,它有一个按钮和一个日志文本框。那么我有这个代码:Asynchronous 异步CTP:我做错了,GUI被阻止了,asynchronous,ctp,Asynchronous,Ctp,我正在使用异步CTP进行一些探测,但是没有得到好的结果,因为GUI被阻塞了 我有一个WPF应用程序,它有一个按钮和一个日志文本框。那么我有这个代码: private async void btnAsync01_Click(object sender, RoutedEventArgs e) { UpdateTxtLog("Enter in Button Async01: " + System.DateTime.Now); await
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 event)设置一个方法,它让该方法使用wait,将执行点返回到调用实际方法的方法,然后执行返回到GUI
因此,在GUI中,我单击按钮,然后在click事件中等待慢方法,如何使用慢方法等待控件应返回GUI,然后GUI不应被阻止。但是,GUI被阻止,并且txtLog在slowMethod完成之前不会显示任何信息
这是因为slowMethod与GUI在同一线程中执行吗?如果我错了,使用async通常使用与调用await方法的方法相同的线程,但我认为使用async的原因可以避免这种情况
如何模拟没有线程的慢速方法。睡眠?也许这就是问题所在,因为在slowMethod中我睡眠线程,而slowMethod的线程与GUI相同
这让我觉得,总是建议在其他线程中执行异步方法的代码?如果这是正确的,那么如果我还需要使用task来不阻塞主线程,那么使用async有什么意义呢
何时使用异步以及何时使用任务
为此,我将在此网站上提供以下示例:
在本例中,它使用client.downloadstringtasksync作为slowMethod,但在我的例子中,我没有使用WebClient,而是使用一个虚拟方法,通过一个sleep来模拟slowMethod。我认为这是唯一的区别
谢谢。
Daimroc.使用执行异步休眠/延迟的
wait TaskEx.Delay(5000)
模拟等待
您可能还想阅读有关async
/wait
的更多信息。有几个好的Channel9视频;Stephen Toub、Eric Lippert和许多其他微软博客作者都有极好的概述。Jon Skeet的“eduasync”博客系列也有助于深入研究。我和其他许多人都写过
以下是async
和await
的实际工作原理,简而言之:
关键字仅启用async
关键字。仅此而已。它不会在后台线程上运行该方法wait
仅当其“waiter”未完成时异步操作wait
btnAsync01\u单击
和slowMethodAsync
都在UI线程上运行slowMethodAsync
将同步运行(执行Thread.Sleep
),然后返回到btnAsync01\u单击
,等待已经完成的任务。由于任务已经完成,btnAsync01\u单击
只会继续执行,而不会屈服于UI消息循环
如果将Thread.Sleep
替换为wait TaskEx.Delay
,则btnAsync01\u单击
将开始在UI线程上运行,并将调用slowMethodAsync
(也在UI线程上运行)。当slowMethodAsync
等待延迟(未完成)时,它会将未完成的任务返回到btnAsync01\u单击
btnAsync01\u单击
将等待
该任务(未完成),并将返回UI循环
延迟过期后,它将完成,并且slowMethodAsync
将恢复(在UI线程上)。当slowMethodAsync
完成时,其返回的任务将完成,并且btnAsync01\u单击将继续(在UI线程上)