在Asp.Net网页按钮中单击“我有以下代码
”//Code is running on Asp.Net worker Thread
var httpClient = new HttpClient();
var task = httpClient.GetAsync("/someapiCall"); //Creates a new thread and executed on it
task.Wait();
现在当我调用task.Wait工作线程会发生什么?
上述代码与下面的代码有什么区别
var httpClient = new HttpClient();
var task = httpClient.GetAsync("/someapiCall"); //Creates a new thread and executed on it
ManualResetEvent mre = new ManualResetEvent(false);
task.ContinueWith((t) => { mre.Set(); });
mre.WaitOne();
答案 0 :(得分:1)
在两种情况下,您的线程将被同步阻塞,等待操作完成。它不会返回ThreadPool
。
如果您使用Wait
或隐式阻止显式,则等待ManualResetEvent
之后设置异步操作完成。
在async
操作上同步阻止可能会导致UI环境中出现死锁(以及存在SynchronizationContext
的其他情况,即ASP.Net)
要不阻止您应该使用async-await
await new HttpClient().GetAsync("/someapiCall");