以下のサンプルでは、非同期の "Process" 関数が同期的に呼び出されると、"await Task.Delay(1000)" の呼び出しによって UI がハングすることがわかります。
「await Task.Delay(1000).ConfigureAwait(false)」を呼び出すか、「Process」呼び出しを別のタスク内にラップすることで、ハングを回避できることがわかっています。問題が同期化コンテキストにあることは理解できます。また、await がそれに何か凝った処理を行っていることもわかっています。たとえば、"await Task.Delay(1000)" 呼び出しを "Task.Delay(1000).Wait()" UI に置き換えると、ハングしません。
誰かが動作を説明してもらえますか (ildasm コードを調べてみましたが、役に立ちませんでした)。どうもありがとう。
public MainWindow()
{
InitializeComponent();
Loaded += OnLoaded;
}
public async void OnLoaded(object sender, RoutedEventArgs args)
{
var task = Process();
MessageBox.Show(task.Result);
}
public async Task<String> Process()
{
await Task.Delay(1000);
return "";
}