C# 为什么我要等待激活任务状态
我试图在VS2012 framework 4.5的表单上使用async和Wait命令。 我的异步方法SlowMethodAsync不返回任何内容。注意:此代码在控制台应用程序中运行良好C# 为什么我要等待激活任务状态,c#,C#,我试图在VS2012 framework 4.5的表单上使用async和Wait命令。 我的异步方法SlowMethodAsync不返回任何内容。注意:此代码在控制台应用程序中运行良好 private void button1_Click(object sender, EventArgs e) { var task = SlowMethodAsync(); for (int i = 0; i < 10; i++) { Console.WriteL
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;
}
private void按钮1\u单击(对象发送者,事件参数e)
{
var task=SlowMethodAsync();
对于(int i=0;i<10;i++)
{
控制台写入线(i);
}
System.Threading.Tasks.TaskStatus状态=任务状态;
Console.WriteLine(“线程上的慢方法结果:{0}”,task.result);//这一行永远不会执行
WriteLine(“在{0}上完成主操作”,Thread.CurrentThread.ManagedThreadId);
}
//为什么这个方法不返回任何内容?
静态异步任务SlowMethodAsync()
{
WriteLine(“在线程:{0}上启动的慢速方法”,Thread.CurrentThread.ManagedThreadId);
等待任务。延迟(2000);
WriteLine(“线程上完成的慢方法:{0}”,Thread.CurrentThread.ManagedThreadId);
返回42;
}
您造成了死锁
使用task.Result
阻塞UI线程-只有在SlowMethodAsync
返回的任务完成后,UI线程才能完成
但是,由于SlowMethodAsync
最初也是在UI线程上启动同步上下文的,因此wait
之后的延续也要在UI线程上执行
因此,在异步方法完成之前,Result
无法完成。。。异步方法在Result
完成之前无法完成
相反,您应该使您的按钮1\u单击方法也异步,然后使用:
Console.WriteLine("Slow method result on Thread: {0}", await task);
这在控制台应用程序中起作用的原因是,SlowMethodAsync
方法不会返回任何特定的同步上下文,因此继续操作可以在任何线程池线程上执行-这不会被等待任务的“主”线程阻塞。一如既往,答案是肯定的。我曾在多个团队中工作过,其中大多数开发人员都不了解其线程执行的上下文(更常见的情况是,当他们试图从非UI同步上下文更新UI项时,会出现异常)。我认为这代表了API文档未能向不熟悉操作系统/并行编程概念的开发人员(这个漂亮的API试图服务的核心组之一)明确一些警告。知道社区如何解决这个问题吗?@marr75:WinForms UI中有大量关于线程的文档。同样,关于异步方法的作用,也有很多信息,尽管这肯定是一个更高级的主题。IMO,问题不在于缺少文档,而在于缺少阅读文档的人。哇,它奏效了:)我是框架4.5的新手。谢谢你的帮助help@JonSkeet这可能是一个更准确的评估。您认为在这种情况下,要求开发人员显式提供上下文会很有用吗?@marr75:上下文捕获/恢复在MSDN、博客、async
FAQ和async
intro文章中有很好的记录。特别是死锁场景于2011年1月首次明确记录(在MSDN博客上),在Channel9上演示了两次,并在MSDN杂志上发布,在SO和MSDN论坛上仍被反复询问和回答。不确定在哪里或如何记录它。。。