C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

非同期処理について質問です /bun (24/04/19(Fri) 09:47) #103078
Re[1]: 非同期処理について質問です /Hongliang (24/04/19(Fri) 09:53) #103079
│└ Re[2]: 非同期処理について質問です /bun (24/04/19(Fri) 10:42) #103081 解決済み
Re[1]: 非同期処理について質問です /WebSurfer (24/04/19(Fri) 10:49) #103082
  └ Re[2]: 非同期処理について質問です /bun (24/04/19(Fri) 13:30) #103083 解決済み


親記事 / ▼[ 103079 ] ▼[ 103082 ]
■103078 / 親階層)  非同期処理について質問です
□投稿者/ bun (1回)-(2024/04/19(Fri) 09:47:39)

分類:[C#] 

以下のようなメソッドがあるとき、
  public async Task Func()
  {
      // 実装省略
  }

呼び出し側で待機すれば、Func()メソッド内での例外をcatchできます。
  try
  {
      await Func();
  } catch(Exception) {
     // catchできる
  }

待機しない場合はcatchできなくなりますが、
  try
  {
      var task = Func();
  } catch(Exception) {
     // catchできない
  }

後から、例外が発生していたことを知る手立てはありますか?

[ □ Tree ] 返信 編集キー/

▲[ 103078 ] / ▼[ 103081 ]
■103079 / 1階層)  Re[1]: 非同期処理について質問です
□投稿者/ Hongliang (1298回)-(2024/04/19(Fri) 09:53:11)
返値で受け取ったTaskオブジェクトに、一通りの値が格納されています。
例外情報はExceptiponプロパティに格納されますが、タスクが完了する(IsCompletedプロパティがtrueを返す)まで間はもちろん取得できません。
[ 親 103078 / □ Tree ] 返信 編集キー/

▲[ 103079 ] / 返信無し
■103081 / 2階層)  Re[2]: 非同期処理について質問です
□投稿者/ bun (2回)-(2024/04/19(Fri) 10:42:59)
なるほどです。
try catch はできないけど、Exceptiponプロパティ に同じだけの情報が格納される
わけですね。

ありがとうございました。

解決済み
[ 親 103078 / □ Tree ] 返信 編集キー/

▲[ 103078 ] / ▼[ 103083 ]
■103082 / 1階層)  Re[1]: 非同期処理について質問です
□投稿者/ WebSurfer (2896回)-(2024/04/19(Fri) 10:49:04)
No103078 (bun さん) に返信

> 後から、例外が発生していたことを知る手立てはありますか?

AppDomain.UnhandledException で補足できるかもしれません。

実装例は以下の記事の下の方の「集約的例外ハンドラによる例外処置の話」と
書いた以降を見てください。

デリゲートを利用した非同期メソッドの実装
http://surferonwww.info/BlogEngine/post/2019/06/19/coding-asynchronous-method-by-using-delegate-in-windows-forms-application.aspx

ただし、質問者さんのコード例は未検証・未確認ですので、補足できなかった
らすみません。
[ 親 103078 / □ Tree ] 返信 編集キー/

▲[ 103082 ] / 返信無し
■103083 / 2階層)  Re[2]: 非同期処理について質問です
□投稿者/ bun (3回)-(2024/04/19(Fri) 13:30:33)
確かに、最後の砦として、集約的例外ハンドラでも例外補足しておくのは良い気がします。

ありがとうございました。

解決済み
[ 親 103078 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -