【发布时间】:2018-09-12 17:36:01
【问题描述】:
在使用 vs 2015 编写的控制台应用程序上考虑此代码:
using System;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
Console.WriteLine("Wait please....");
DateTime time1 = DateTime.Now;
Task task1 = MyAsyncFun1();
Task task2 = MyAsyncFun2();
task1.Wait();
task2.Wait();
DateTime time2 = DateTime.Now;
Console.WriteLine("time elapsed: " +
(time2 - time1).TotalSeconds);
Console.ReadLine();
}
private static async Task MyAsyncFun1()
{
await Task.Yield();
System.Threading.Thread.Sleep(2000);
}
private static async Task MyAsyncFun2()
{
await Task.Yield();
System.Threading.Thread.Sleep(2000);
}
}
有两种异步调用的方法,一切正常,“经过的时间”不超过 2 秒,因为执行是并行的。
但是当我在这样的 ApiController 的 acion 方法中编写这段代码时:
public class MyController : ApiController
{
private static async Task MyAsyncFun1()
{
await Task.Yield();
System.Threading.Thread.Sleep(2000);
}
private static async Task MyAsyncFun2()
{
await Task.Yield();
System.Threading.Thread.Sleep(2000);
}
public async Task<ApiResult> MyAction([FromBody] Mymodel model)
{
DateTime time1 = DateTime.Now;
Task task1 = MyAsyncFun1();
Task task2 = MyAsyncFun2();
task1.Wait();
task2.Wait();
DateTime time2 = DateTime.Now;
double d=(time2 - time1).TotalSeconds;
return .....;
}
}
执行在 task1.Wait() 语句上无限期挂起。
【问题讨论】:
-
我不明白 DI 与此有什么关系,当您可以在异步方法中
await时,您为什么要Wait()? -
"不要阻塞异步代码" > 永远不要在
async Task方法上使用.Wait() -
我看这里没有依赖注入?
-
控制台应用程序没有同步上下文。 asp.net 确实(无论如何都是“旧”asp.net。我相信他们已经为 asp.net 核心消除了它)
-
@GerriePretorius - 他正在使同步上下文陷入僵局。这类问题的例子太多了,我认为构建另一个指出这一点的答案没有任何价值。
标签: c# asp.net-web-api async-await