MVVMにおいてVMで非同期は必要か?async void/Taskのどちらが良いか?非同期処理の例外ハンドリングは?

C# MVPを始めとした方々がガチ議論!(誰でも編集可なので抜け等あればご自由に)
9
前へ 1 2 3 ・・ 6 次へ
Ktz @ktz_alias

@masaru_b_cl @ugaya40 @xin9le VMからMのasync voidなメソッドを呼ぶ場合、VM側でawaitしないと、Warning出るような気が? それしか呼ばないのなら無視しても影響ないかもですが(Warning残すのが個人的にイヤなので)

2014-12-11 15:46:28
白い高野さん @masaru_b_cl

@ktz_alias @ugaya40 @xin9le さっきそれ試したら、await Taskなら警告出ましたが、async voidは出ませんでした。

2014-12-11 15:47:38
Ktz @ktz_alias

@masaru_b_cl @ugaya40 @xin9le なるほど、純粋に投げっぱなしジャーマンかませれるのかー

2014-12-11 15:48:57
白い高野さん @masaru_b_cl

WinFormsに限って言えば、async voidの中で例外飛ばすとちゃんと集約例外ハンドラが拾ってくれるっぽいな。Taskだと自分で拾わないと虚空に消える

2014-12-11 16:05:04
白い高野さん @masaru_b_cl

@masaru_b_cl ただし、イベントハンドラーがasyncならawait model.DoAsyncMethod()で集約例外ハンドラーで拾ってくれる。スレッド切替のこと考えれば確かに。

2014-12-11 16:09:38
白い高野さん @masaru_b_cl

WinFormsに限れば、async voidの方が混乱少なそう

2014-12-11 16:10:55
白い高野さん @masaru_b_cl

Webじゃなくてリッチクライアントアプリなら、Mはasync voidという割り切りも、何となく分かるな

2014-12-11 16:13:26
白い高野さん @masaru_b_cl

async/awaitの挙動、人類が理解するには辛くないかこれ……

2014-12-11 16:21:35
尾上 雅則 @ugaya40

@neuecc 前にも話しましたがasync Taskだとそれこそ「例外の処理の責任」が不要どころかやるべきではないのにVM側に伸びてしまうます。その場合単純にasync voidの方に比べ、情報がゆがんでしまっています。

2014-12-11 16:52:13
neuecc @neuecc

@ugaya40 普通のvoidなら伸びないのか、っていったらそんなことないですよね?voidだと例外が伝搬されるからVM側にも原理的には伸びますし。

2014-12-11 16:53:11
尾上 雅則 @ugaya40

@neuecc で、WindowsのUIが単一スレッドという制約はOSレベルのものと聞いているので、WPFだとかそういう固有の問題ではないので、結局リッチクライアントの場合相性が悪そうと考えているのです。

2014-12-11 16:53:12
尾上 雅則 @ugaya40

@neuecc 完全に想定外の例外については集約エラーハンドラに伸びますし、想定内の例外はModel内で適切に処理されているべきかと。

2014-12-11 16:54:10
尾上 雅則 @ugaya40

@neuecc あーでもこれ少し考えますね。この議論の肝かも。

2014-12-11 16:54:30
尾上 雅則 @ugaya40

わからなくなってきたけど、結局Taskクラスが意味を持ちすぎていることからくる問題なのかな・・・。これ何度考えても悩む。

2014-12-11 17:01:49
尾上 雅則 @ugaya40

msdn.microsoft.com/ja-jp/magazine… これに出てくる「通常の例外処理」って何を想定しているんだか感。システム例外なら集約エラーハンドラで問題ないし、そうじゃないならリッチクライアントの文脈ならModel内では普通にTaskで受けているんだから普通にやればいい。

2014-12-11 17:06:54
尾上 雅則 @ugaya40

このような例外は、AppDomain.UnhandledException、またはすべてをキャッチする GUI/ASP.NET アプリケーション用の同様のイベントを使用して監視できますが、通常の例外処理でこれらのイベントを使うと管理が困難になります。

2014-12-11 17:07:04
白い高野さん @masaru_b_cl

MにObservableCollection Listなプロパティがあったとして、UIでm.List.CollectionChanged += ...;でイベントハンドラーを登録する。このとき、Mのメソッドがasync voidじゃなくてvoidだと、

2014-12-11 17:09:04
白い高野さん @masaru_b_cl

@masaru_b_cl 先述のイベントハンドラー内で、UIスレッドでやってね、泣き術が必要になる、という理解はあってるかな?

2014-12-11 17:09:29
白い高野さん @masaru_b_cl

@masaru_b_cl 合ってるとすると、async voidの方がいいなぁ

2014-12-11 17:11:00
尾上 雅則 @ugaya40

async Taskなメソッドを見た時の使う側の反応って、ContinueWith.TaskContinuationOptions.OnlyOnFaulted を書くことではないのかな?そうだとするならまさにそれが引っかかっているところなんだよなぁ。

2014-12-11 17:13:46
白い高野さん @masaru_b_cl

@ugaya40 そういえば、M内での例外ハンドリングって、FileNotFoundExceptionみたいなのを拾って、Mの状態を変化させる(例えばbool FileNotFoundみたいな変更通知プロパティにtrue設定)ということを指していることで合ってますか?

2014-12-11 17:16:57
尾上 雅則 @ugaya40

@masaru_b_cl 業務例外のことですか?それとも想定外なシステム例外です?

2014-12-11 17:18:12
白い高野さん @masaru_b_cl

@ugaya40 今のは業務例外になりますね。想定的なシステム例外とは、ネットワークつながってねぇよ、とかのことでしょうか?

2014-12-11 17:18:51
前へ 1 2 3 ・・ 6 次へ