18

try catch outside of:await Task.Run(() =>は理にかなっていますか、それとも await の中でのみ使用しますか?

private async void Test()
{
     try
     {
         await Task.Run(() =>
         {
             try
             {
                  DoingSomething();
             }
             catch (Exception ex)
             {
                  log.Error(ex.Message);
             }
         });
      }
      catch (Exception ex)
      {
          log.Error(ex.Message);
      }
}
4

4 に答える 4

13

渡したデリゲートが例外を発生させた場合、返されたタスクのTask.Run外部でそれをキャッチできます。Task.Runawait

awaitそれがブロックであるかのように考えるべきではありません。「待機中」というものはありません。代わりに、await1 つの引数を取る演算子 (この場合はTaskによって返されるTask.Run) と考えてください。Task.Runデリゲートから例外をキャッチし、返されたTask;に配置します。await次に、その例外を伝播します。

于 2013-07-17T15:51:06.110 に答える
13

デリゲート内で処理Exceptionする場合 (この場合はログ記録のためだけに)、await通常の状況では例外は発生しません。これで問題ないはずです。

private async Task Test()
{
         await Task.Run(() =>
         {
             try
             {
                  DoingSomething();
             }
             catch (Exception ex)
             {
                  log.Error(ex.Message);
             }
         });

}

しかし、あなたは をawaiting しているTaskので、ほとんどの場合DoSomethingElseTestメソッドには - の結果によって影響を受ける可能性のあるものがあるでしょう。その場合、 aroundTaskを持つことも意味があります。try/catchawait

private async Task Test()
{
     try
     {
         await Task.Run(() =>
         {
             try
             {
                  DoingSomething();
             }
             catch (SomeSpecialException spex)
             {
                  // it is OK to have this exception
                  log.Error(ex.Message);
             }
         });

         DoSomethingElse(); // does not run when unexpected exception occurs.
      }
      catch (Exception ex)
      {
          // Here we are also running on captured SynchronizationContext
          // So, can update UI to show error ....
      }
}
于 2013-07-17T17:51:35.583 に答える
2

外部コードにも try catch を追加できます。非同期呼び出し中に例外が発生すると、コンパイラは catch セクションを実行します。ここでは、キャッチを試行する必要がある理由について詳しく説明しますhttp://msdn.microsoft.com/en-us/library/vstudio/0yd65esw.aspx非同期メソッドの例外

于 2013-07-17T15:53:29.167 に答える
-1

これは .Net 6 での動作です。

try{
 await Task.Run(()=>   & call whatever method    );
}
catch { handle the exception }          <-- the catch will never get hit. An unhandled exception in the Task.Run line will happen

ただし、これは機能します。

try{
await Task.Run(async ()=> & call some method );
}
catch(Exception ex){
   handle the exception
}

()=> の前の async は、.Net 6 の場合に存在する必要があります

私はこれを確認しました。

于 2022-02-06T05:10:57.810 に答える