MVVMにおいてVMで非同期は必要か?async void/Taskのどちらが良いか?非同期処理の例外ハンドリングは?
- masaru_b_cl
- 32323
- 20
- 7
- 1
@masaru_b_cl @ugaya40 @xin9le VMからMのasync voidなメソッドを呼ぶ場合、VM側でawaitしないと、Warning出るような気が? それしか呼ばないのなら無視しても影響ないかもですが(Warning残すのが個人的にイヤなので)
2014-12-11 15:46:28@ktz_alias @ugaya40 @xin9le さっきそれ試したら、await Taskなら警告出ましたが、async voidは出ませんでした。
2014-12-11 15:47:38WinFormsに限って言えば、async voidの中で例外飛ばすとちゃんと集約例外ハンドラが拾ってくれるっぽいな。Taskだと自分で拾わないと虚空に消える
2014-12-11 16:05:04@masaru_b_cl ただし、イベントハンドラーがasyncならawait model.DoAsyncMethod()で集約例外ハンドラーで拾ってくれる。スレッド切替のこと考えれば確かに。
2014-12-11 16:09:38@neuecc 前にも話しましたがasync Taskだとそれこそ「例外の処理の責任」が不要どころかやるべきではないのにVM側に伸びてしまうます。その場合単純にasync voidの方に比べ、情報がゆがんでしまっています。
2014-12-11 16:52:13@ugaya40 普通のvoidなら伸びないのか、っていったらそんなことないですよね?voidだと例外が伝搬されるからVM側にも原理的には伸びますし。
2014-12-11 16:53:11@neuecc で、WindowsのUIが単一スレッドという制約はOSレベルのものと聞いているので、WPFだとかそういう固有の問題ではないので、結局リッチクライアントの場合相性が悪そうと考えているのです。
2014-12-11 16:53:12@neuecc 完全に想定外の例外については集約エラーハンドラに伸びますし、想定内の例外はModel内で適切に処理されているべきかと。
2014-12-11 16:54:10msdn.microsoft.com/ja-jp/magazine… これに出てくる「通常の例外処理」って何を想定しているんだか感。システム例外なら集約エラーハンドラで問題ないし、そうじゃないならリッチクライアントの文脈ならModel内では普通にTaskで受けているんだから普通にやればいい。
2014-12-11 17:06:54このような例外は、AppDomain.UnhandledException、またはすべてをキャッチする GUI/ASP.NET アプリケーション用の同様のイベントを使用して監視できますが、通常の例外処理でこれらのイベントを使うと管理が困難になります。
2014-12-11 17:07:04MにObservableCollection Listなプロパティがあったとして、UIでm.List.CollectionChanged += ...;でイベントハンドラーを登録する。このとき、Mのメソッドがasync voidじゃなくてvoidだと、
2014-12-11 17:09:04@masaru_b_cl 先述のイベントハンドラー内で、UIスレッドでやってね、泣き術が必要になる、という理解はあってるかな?
2014-12-11 17:09:29async Taskなメソッドを見た時の使う側の反応って、ContinueWith.TaskContinuationOptions.OnlyOnFaulted を書くことではないのかな?そうだとするならまさにそれが引っかかっているところなんだよなぁ。
2014-12-11 17:13:46@ugaya40 そういえば、M内での例外ハンドリングって、FileNotFoundExceptionみたいなのを拾って、Mの状態を変化させる(例えばbool FileNotFoundみたいな変更通知プロパティにtrue設定)ということを指していることで合ってますか?
2014-12-11 17:16:57@ugaya40 今のは業務例外になりますね。想定的なシステム例外とは、ネットワークつながってねぇよ、とかのことでしょうか?
2014-12-11 17:18:51