gpt4 book ai didi

c# - 为什么我会收到 WaitingforActivation TaskStatus

转载 作者:太空狗 更新时间:2023-10-29 23:08:45 27 4
gpt4 key购买 nike

我正在尝试在 VS2012 框架 4.5 的表单上使用异步和等待命令。我的异步方法 SlowMethodAsync 不返回任何内容。请注意,此代码在控制台应用程序中运行良好。

private void button1_Click(object sender, EventArgs e)
{
var task = SlowMethodAsync();

for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
}

System.Threading.Tasks.TaskStatus status = task.Status;

Console.WriteLine("Slow method result on Thread: {0}", task.Result); //This line never executes
Console.WriteLine("Main complete on {0}", Thread.CurrentThread.ManagedThreadId);
}

//Why is this method not returning anything?

static async Task<int> SlowMethodAsync()
{
Console.WriteLine("Slow method started on Thread: {0}", Thread.CurrentThread.ManagedThreadId);

await Task.Delay(2000);

Console.WriteLine("Slow method complete on Thread: {0}", Thread.CurrentThread.ManagedThreadId);

return 42;
}

最佳答案

你造成了僵局。

使用 task.Result 会阻塞 UI 线程 - 在 SlowMethodAsync 返回的任务完成之前它无法完成。

但是,因为 SlowMethodAsync 最初是在 UI 线程上使用同步上下文启动的,await 之后的延续 想要执行UI 线程。

因此 Result 在异步方法完成之前无法完成...并且在 Result 完成之前异步方法无法完成。

相反,您也应该使您的 button1_Click 方法异步,然后使用:

Console.WriteLine("Slow method result on Thread: {0}", await task); 

这在控制台应用程序中起作用的原因是 SlowMethodAsync 方法不会有任何特定的同步上下文可以返回,因此延续可以在任何线程池线程上执行 -这不会被等待任务的“主”线程阻塞。

关于c# - 为什么我会收到 WaitingforActivation TaskStatus,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15690572/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com