[解決済み] await vs Task.Wait - デッドロック?
質問
との違いがよくわかりません。
Task.Wait
と
await
.
ASP.NETのWebAPIサービスで、以下のような関数のようなものがあります。
public class TestController : ApiController
{
public static async Task<string> Foo()
{
await Task.Delay(1).ConfigureAwait(false);
return "";
}
public async static Task<string> Bar()
{
return await Foo();
}
public async static Task<string> Ros()
{
return await Bar();
}
// GET api/test
public IEnumerable<string> Get()
{
Task.WaitAll(Enumerable.Range(0, 10).Select(x => Ros()).ToArray());
return new string[] { "value1", "value2" }; // This will never execute
}
}
ここで
Get
はデッドロックになります。
何が原因なのでしょうか?なぜ、私がブロック待ちではなく
await Task.Delay
?
解決方法は?
Wait
と
await
- は、概念的には似ていますが、実際にはまったく異なるものです。
Wait
はタスクが完了するまで同期的にブロックします。つまり、現在のスレッドは文字通りタスクの完了を待ってブロックされるのです。一般的なルールとして、"を使うべきです。
async
でブロックしないことです。
async
のコードを使用します。私のブログでは、詳細に踏み込んで
非同期コードでのブロッキングはデッドロックを引き起こすか
.
await
はタスクが完了するまで非同期で待機します。つまり、現在の
メソッド
は "paused"(その状態はキャプチャされます)であり、そのメソッドは呼び出し元に不完全なタスクを返します。その後
await
式が完了すると、メソッドの残りは継続としてスケジューリングされます。
また、quot;cooperative block"とありますが、これは、以下のようなタスクのことを指していると思われます。
Wait
が待機中のスレッドで実行される可能性があります。このようなことが起こりうる状況もありますが、これは最適化です。このような状況はたくさんあります。
できない
例えば、そのタスクが別のスケジューラー用のものであったり、すでに開始されていたり、コードタスクでない場合(あなたのコードの例のような場合。
Wait
を実行することはできません。
Delay
タスクをインラインで実行するためのコードがないため)。
あなたは、私の
async
/
await
イントロ
を参考にしました。
関連
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] 非同期関数+await+setTimeoutの組合せ
-
[解決済み] 複数のタスクにasync/awaitを使用する
-
[解決済み] ロックステートメントのボディ内で 'await' 演算子を使用できないのはなぜですか?
-
[解決済み] C#でawaitを使わずに非同期メソッドを安全に呼び出す方法
-
[解決済み】Parallel.ForEachで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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】WebResource.axdとは何ですか?