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

@ugaya40 @xin9le async/awaitの理解が怪しいのがバレバレですが、ということは void HogeHoge(param)にはasync/await登場しない?もしくは必要ならprivateなasync Task DoHoge(...)を用意する?
2014-12-11 14:50:54
@masaru_b_cl @xin9le あ、ごめんなさい一つ前の違います。Mの表面にasync付くことはありますが、VMでそれを同期以外で呼ぶことはありません。そしてその中のawaitの後に戻りを返すこともありません。VMの話から初めて勘違いしました
2014-12-11 15:03:05
@ugaya40 @xin9le 整理すると、Mにはasync void DoHoge(param)要して、中でawaitする(たとえば複数データソース相手の非同期処理等)。VMではICommand.Execute等の中でawait model.DoHoge(param);する
2014-12-11 15:12:18
そもそも論でVMでも非同期って話はメリットがないし。で、この問題から考えれば戻り値がなく例外のハンドリングをM側でasync Taskよりasync voidの方が明確だし。つまりasync/awaitのメリットがほとんど感じれなくて相性の悪さある。
2014-12-11 15:12:52
@masaru_b_cl @xin9le いやVM側でawaitとかないです。VM側は常になげっぱじゃないと、Mの例外がシステム例外が業務例外かのハンドリングをVMですることになるじゃないですか。Mの中でawaitしてるからしかたなくMの表面にasync付くことがあるくらいです。
2014-12-11 15:13:58
@ugaya40 @xin9le あ、勘違いしてました。async voidなメソッドならawait付けなくても呼び出せますものね。
2014-12-11 15:17:23
あくまでvoidのかわりのTask(無印)というイメージで組み立てたほうがいいと思うけれど。Taskは戻り値を返す、という意味ではない。
2014-12-11 15:19:01
async voidとasync Taskについてvoidの悪さ知りながらTaskもなぁって言っているのは、まぁ単純にメソッドシグネクチャの情報量減るのでそう考えるとそもそもそこ無理にasync使うところか?って思うわけです。
2014-12-11 15:23:46
@neuecc @ugaya40 @xin9le 仮にvoidでなくTaskにするばあい、Mの処理の最後にawait Task.FromResult(0);みたいなのが必要になるわけですよね?(.NET 4.6だとTask.Completedが使える?)
2014-12-11 15:25:27
@ugaya40 エンジンがawaitを可能にするかしないかってぐらいだと思いますけどねー。相性が悪いのだとしたら、それはasync以前のエンジンのせいなので改善してもらわないと(旧ASP.NET MVCもそんな感じで一部相性の悪さが残ってた)
2014-12-11 15:26:29
@neuecc エンジンというか、クラス呼び出しの連鎖の中で、同期と非同期の境界で、意味的にはvoidにしたいのにTaskにすることでメソッドシグネクチャから情報量が欠落(増える)しますよね。それってasync/await自体が抱えてる問題じゃないでしょうか。
2014-12-11 15:28:52
@ugaya40 UnitとTaskに違いありますかねえ。async voidとvoidの違いは、voidは例外が伝搬されますがasync voidは虚空の彼方に消える。async Taskのほうがvoidの近い印象ですね、同期と非同期の最後の境界をエンジンが処理すれば、ですが。
2014-12-11 15:34:04
@ugaya40 async voidと書くのは、書き手が自分で明示的に境界を打ち切ること。async Taskと書くのは、その先に委ねること。非同期の連鎖(と実行効率)のなかでは、境界は引き伸ばしたほうがいいと思ってます。
2014-12-11 15:36:13