Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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
C# 为什么我要等待激活任务状态_C# - Fatal编程技术网

C# 为什么我要等待激活任务状态

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

我试图在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.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论坛上仍被反复询问和回答。不确定在哪里或如何记录它。。。