BETA

[WinForm] UIスレッド内での非同期処理

投稿日:2020-06-20
最終更新:2020-06-26

・ 非同期関数

static async Task<string> AsyncFunc()  
{  
    await Task.Delay(3000);  
    return "OK";  
}  

1-1)「Result」や「Wait()」で待つ方法

private void button_Click(object sender, EventArgs e)  
{  
    var result = AsyncFunc().Result;  
    Console.WriteLine(result);  
}  

※UIスレッド内でこの記述を使用するとデッドロックする

1-2) AsyncFunc関数を以下のように変更するとデッドロックを回避できる

static async Task<string> AsyncFunc()  
{  
    await Task.Delay(3000).ConfigureAwait(false);  
    return "OK";  
}  

※ただし、UIの制御はできない

2)「async」と「await」で待つ方法

private async void button_Click(object sender, EventArgs e)  
{  
    var result = await AsyncFunc();  
    Console.WriteLine(result);  
}  

※デッドロックせず、UIの制御もできる

3) 「Result」や「Wait()」を使うのはどんな場面?
これについては調べ切れていませんが、unsafeなクラス内でawaitを使用した場合にエラーが発生しました。しかし、「Result」や「Wait()」であればエラーは発生しませんでした。

CS4004: unsafe コンテキストで待機することはできません。  
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@u4xiの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう