# async 鎖死問題
###### tags: `C#`
ASP.NET 4.x 應用程式有 AspNetSynchronizationContext, 因此若使用非同步呼叫後, 中途 .Result 可能造成程式鎖死, 因為 async 在等待 AspNetSynchronizationContext 釋放空間處理回來的結果, .Result 的程式則佔用著 AspNetSynchronizationContext 等待 async 的結果。
因此會建議若用 async 後就不要自己 .Result, 若真的需要可以在 await 的地方使用 .ConfigureAwait(false), 其作用是 await 結果回來後會用另一個執行緒執行, 如此就不會有所死問題產生。使用方法如下
var client = new HttpClient();
string content = await client.GetStringAsync(url).ConfigureAwait(false);
return content;
.ConfigureAwait(false) 需要放在執行 await 的地方,有時被包在 SDK 中可能沒辦法使用,這時候可以用 Task.Run(async () => await MyAsyncMethod()); ,強制他開一個新的 thread 執行,這樣就不會有 synchronous method 回來時, SynchorizationContext 為了能夠確保執行緒重新取得之後能夠取得原本 main thread 造成的 dead lock 問題
由範例程式可看出,程式偏好使用同一個 thread 執行,在確實需要反覆確認結果是否回來的地方才會用新thread。
test7: 在實際需要等待的地方加 .ConfigureAwait(false),使等待的地方不使用 main thread
test77: 用 Task.Run 強制開一個新 thread,強制拖離 main thread 執行
test8: 全部都使用 async await,不會因為 SynchorizationContext 想用原本的 thread

執行結果

參考文件
[How to call asynchronous method from synchronous method in C#?](https://stackoverflow.com/questions/9343594/how-to-call-asynchronous-method-from-synchronous-method-in-c)
[NET 程式鎖死與 SynchronizationContext](https://www.huanlintalk.com/2016/01/asyc-deadlock-in-aspbet.html)