MVVMにおいてVMで非同期は必要か?async void/Taskのどちらが良いか?非同期処理の例外ハンドリングは?
- masaru_b_cl
- 32377
- 20
- 7
- 1
@neuecc あ、なのでTestメソッド内部はちゃんと例外が発生する可能性のある非同期メソッドの呼び出しに責任を持つってことです。Testメソッドで例外が発生して、VM側にその例外をどうするかという選択肢があるべきではないので。
2014-12-11 19:26:26@ugaya40 同期の時は選択肢があるのに、非同期の時は選択肢がない、ってことでいいですか?それを「良い」とするのは納得できない話ではないですけれど。
2014-12-11 19:28:36@neuecc 同期の時もないです。例外が起こった時の対応はPresenPlat関係なく決まるのでModel内で完結しますから。どうしょうもないのだけ集約エラーハンドラ、非同期のGetTextとかVMからよばれないやつはasync Taskです
2014-12-11 19:30:40ちなみにこのコードはアプリを殺せるので、async voidが危険(ネストさせた時の挙動は予測困難)なのはカワリマセン。 gist.github.com/neuecc/563b4a9…
2014-12-11 19:32:56@ugaya40 んー、同期の時は「しようと思えばできる」はず。しようと思えばできるか、しようと思ってもできないかが違いだと思ってます。
2014-12-11 19:36:11@ugaya40 async Taskのほうがしようと思いたい度が強まるってことですか?async voidは根本的にできない。voidはできるけどしようと思いにくい。async Taskはしようと思いたくなる。という?それなら完全に慣習の問題では。
2014-12-11 19:38:08@neuecc 慣習の問題かどうかでは確かに悩んでいます。そして慣習ならasync Taskの方がいいに決まってる。でもTaskだとVM側から呼びっぱなしにすると警告なわけで慣習の問題を超えてる感を感じます。
2014-12-11 19:39:47@ugaya40 ええと、だからバインディングエンジンが問題で、エンジンにTaskごと返せるようになるべき、というのが私の言い分ですねー。ただしこれは理想論かもしれません。
2014-12-11 19:41:19私が WPF アプリ書くと Model との I/F に Task なんて出てこないのでそのコンテキストで async/await 使ったことがないマン
2014-12-11 19:51:13View は Model の状態を表示 & 変化させているに過ぎないし、View (ViewModel) が Model に対して操作 (= Task (= 終了を待つ必要のある動作)) を要求する必要があるケースに今のところ出会っていない
2014-12-11 20:13:51だからこそ、ViewModel -> Model は戻り値 void を同期で叩く以外にないし、ViewModel で await なんてするわけがないし、Model が VM に叩かせる前提での Task を公開した時点で負け という考えでいつもアプリ書いてますね
2014-12-11 20:14:11ViewModelがawaitするかっていうよりも、ViewModelが持て余すTaskをどうするかってことですにゃ。これはフレームワークが解答のガイドを掲示してあげるべき(AsyncCommandなりなんなりね)。現状、結論づいていないなら持て余しちゃうのはしょうがない。
2014-12-11 20:18:45ただし間違いなくC#的に言えるのはasyncのシステム上、async voidするなら最上位であるべき。Modelは間違いなく最上位にはならないので、Modelがasync voidするという点だけは恐らくどう転んでも推奨できない。
2014-12-11 20:19:04