[解決済み] async/await - タスクとvoidをいつ返すか?
質問
どのような場合に使用するのでしょうか?
public async Task AsyncMethod(int num)
ではなく
public async void AsyncMethod(int num)
唯一考えられるシナリオは、タスクの進行状況を追跡できるようにする必要がある場合です。
さらに、以下のメソッドでは、asyncやawaitキーワードは不要でしょうか?
public static async void AsyncMethod2(int num)
{
await Task.Factory.StartNew(() => Thread.Sleep(num));
}
解決方法は?
-
通常であれば
Task
. 主な例外は 必要 を持たせることです。void
の戻り値型(イベント用)です。呼び出し側を禁止する理由がなければawait
なぜそれを認めないのですか? -
async
を返すメソッドです。void
は別の面で特殊です。 トップレベルの非同期処理 また、タスクが例外を返したときに適用される追加のルールもあります。この違いを説明する最も簡単な方法は、例で説明することです。
static async void f()
{
await h();
}
static async Task g()
{
await h();
}
static async Task h()
{
throw new NotImplementedException();
}
private void button1_Click(object sender, EventArgs e)
{
f();
}
private void button2_Click(object sender, EventArgs e)
{
g();
}
private void button3_Click(object sender, EventArgs e)
{
GC.Collect();
}
f
の例外は常に "observed"です。トップレベルの非同期メソッドから出た例外は、単に他の扱われない例外と同じように扱われます。
g
の例外は決して観測されない。ガベージコレクタがタスクを片付けに来たとき、タスクが例外を発生させたこと、そして誰もその例外を処理しなかったことを見ます。そのとき
TaskScheduler.UnobservedTaskException
ハンドラが実行されます。このようなことは決してあってはならないことです。あなたの例を使うなら
public static async void AsyncMethod2(int num)
{
await Task.Factory.StartNew(() => Thread.Sleep(num));
}
はい、使用します。
async
と
await
ここで、例外が発生してもメソッドが正しく動作することを確認します。
詳しくはこちらをご覧ください。 https://docs.microsoft.com/en-us/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming
関連
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] 非同期Task<T>メソッドを同期的に実行するにはどうしたらいいですか?
-
[解決済み] async/await関数を並列に呼び出す
-
[解決済み] Task.Runの正しい使い方とasync-awaitだけの使い方
-
[解決済み】非同期プログラミングとマルチスレッドの違いは何ですか?
-
[解決済み] 非同期await return タスク
最新
-
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#で四捨五入する方法
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?