[解決済み] async」と「await」の使い方とタイミング
質問
私の理解では
async
と
await
しかし、これらを使用することは、長時間のロジックを実行するためにバックグラウンドスレッドを生成することと同じなのでしょうか?
現在、最も基本的な例を試しているところです。インラインでコメントを追加しています。それを明確にすることができますか?
// I don't understand why this method must be marked as `async`.
private async void button1_Click(object sender, EventArgs e)
{
Task<int> access = DoSomethingAsync();
// task independent stuff here
// this line is reached after the 5 seconds sleep from
// DoSomethingAsync() method. Shouldn't it be reached immediately?
int a = 1;
// from my understanding the waiting should be done here.
int x = await access;
}
async Task<int> DoSomethingAsync()
{
// is this executed on a background thread?
System.Threading.Thread.Sleep(5000);
return 1;
}
解決方法は?
を使用する場合
async
と
await
を実行すると、コンパイラはバックグラウンドでステートマシンを生成する。
以下はその例で、高レベルの詳細について説明できると思います。
public async Task MyMethodAsync()
{
Task<int> longRunningTask = LongRunningOperationAsync();
// independent work which doesn't need the result of LongRunningOperationAsync can be done here
//and now we call await on the task
int result = await longRunningTask;
//use the result
Console.WriteLine(result);
}
public async Task<int> LongRunningOperationAsync() // assume we return an int from this long running operation
{
await Task.Delay(1000); // 1 second delay
return 1;
}
OK、ではここで何が起こるか。
-
Task<int> longRunningTask = LongRunningOperationAsync();
が実行を開始します。LongRunningOperation
-
メインスレッド(スレッドID=1)で独立した作業が行われるとします。
await longRunningTask
に到達します。ここで、もし
longRunningTask
が終了しておらず、まだ実行中です。MyMethodAsync()
は呼び出し元のメソッドに戻るので、メインスレッドがブロックされることはありません。そのため、メインスレッドがブロックされることはありません。longRunningTask
が終了すると、ThreadPool からのスレッド (任意のスレッドで可) がMyMethodAsync()
を以前のコンテキストで実行し、実行を継続します (この場合、コンソールに結果を出力します)。
2つ目のケースは
longRunningTask
はすでに実行を終了しており、結果が利用可能です。に到達すると
await longRunningTask
そのため、コードはまったく同じスレッドで実行され続けます。(この場合、結果はコンソールに出力されます)。もちろん、これは上記の例には当てはまりません。
Task.Delay(1000)
が関わってきます。
関連
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] enumを列挙するには
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] DateTime型の誕生日から年齢を計算するにはどうしたらいいですか?
-
[解決済み] Microsoft Officeをインストールせずに、C#でExcel(.XLSおよび.XLSX)ファイルを作成するにはどうすればよいですか?
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] async/await - タスクとvoidをいつ返すか?
-
[解決済み] Task.Runの正しい使い方とasync-awaitだけの使い方
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】2年前のMSDateを把握する【クローズド