我打印出AsyncDemoViewModel中的Messages属性字符串列表。等待不释放异步方法中的调用线程
如果我使用了Thread.Sleep(1000)中GetVideosSlowlyAsync()的输出是
Time spent: 4001 milliseconds
- Started on thread 18, finished on thread 18
- Started on thread 18, finished on thread 18
- Started on thread 18, finished on thread 18
- Started on thread 18, finished on thread 18
如果我使用等待Task.Delay(1000)中GetVideosSlowlyAsync()的输出是
Time spent: 4053 milliseconds
- Started on thread 12, finished on thread 19
- Started on thread 19, finished on thread 16
- Started on thread 16, finished on thread 19
- Started on thread 19, finished on thread 9
为什么await调用没有释放调用线程?我期待await版本的完成时间快大约4倍。
控制器代码:
public class AsyncDemoController : Controller
{
private DepartmentDb _db;
public AsyncDemoController(DepartmentDb db)
{
_db = db;
}
public async Task<ActionResult> Index()
{
var sw = Stopwatch.StartNew();
var v1 = await GetVideosSlowlyAsync();
var v2 = await GetVideosSlowlyAsync();
var v3 = await GetVideosSlowlyAsync();
var v4 = await GetVideosSlowlyAsync();
var vm = new AsyncDemoViewModel() {Videos = v1.Item2, Messages = new List<string>()};
sw.Stop();
vm.Messages.Add(string.Format("Time spent: {0} milliseconds", sw.ElapsedMilliseconds));
vm.Messages.Add(v1.Item1);
vm.Messages.Add(v2.Item1);
vm.Messages.Add(v3.Item1);
vm.Messages.Add(v4.Item1);
return View(vm);
}
private async Task<Tuple<string, IEnumerable<Video>>> GetVideosSlowlyAsync()
{
var t1 = Thread.CurrentThread.ManagedThreadId;
await Task.Delay(1000); // Thread.Sleep(1000);
var t2 = Thread.CurrentThread.ManagedThreadId;
return Tuple.Create(string.Format("Started on thread {0}, finished on thread {1}", t1, t2), _db.Videos.AsEnumerable());
}
}