Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 异步CTP:我做错了,GUI被阻止了_Asynchronous_Ctp - Fatal编程技术网

Asynchronous 异步CTP:我做错了,GUI被阻止了

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

我正在使用异步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 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
    关键字。仅此而已。它不会在后台线程上运行该方法
  • wait
    仅当其“waiter”未完成时异步操作
因此,在您的情况下,
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线程上)