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

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

@masaru_b_cl @xin9le いやVMから叩くMのメソッドはただの void HogeHoge(param)ですよ。

2014-12-11 14:46:52
白い高野さん @masaru_b_cl

@ugaya40 @xin9le async/awaitの理解が怪しいのがバレバレですが、ということは void HogeHoge(param)にはasync/await登場しない?もしくは必要ならprivateなasync Task DoHoge(...)を用意する?

2014-12-11 14:50:54
白い高野さん @masaru_b_cl

Mのエンドポイントは同期にして、内部でTask.Runなどで投げる、かな?

2014-12-11 14:52:48
尾上 雅則 @ugaya40

@masaru_b_cl @xin9le あ、ごめんなさい一つ前の違います。Mの表面にasync付くことはありますが、VMでそれを同期以外で呼ぶことはありません。そしてその中のawaitの後に戻りを返すこともありません。VMの話から初めて勘違いしました

2014-12-11 15:03:05
尾上 雅則 @ugaya40

@masaru_b_cl @xin9le でもasync Taskと相性悪くてasync voidにしかならんです。

2014-12-11 15:05:22
白い高野さん @masaru_b_cl

@ugaya40 @xin9le 整理すると、Mにはasync void DoHoge(param)要して、中でawaitする(たとえば複数データソース相手の非同期処理等)。VMではICommand.Execute等の中でawait model.DoHoge(param);する

2014-12-11 15:12:18
尾上 雅則 @ugaya40

そもそも論でVMでも非同期って話はメリットがないし。で、この問題から考えれば戻り値がなく例外のハンドリングをM側でasync Taskよりasync voidの方が明確だし。つまりasync/awaitのメリットがほとんど感じれなくて相性の悪さある。

2014-12-11 15:12:52
尾上 雅則 @ugaya40

@masaru_b_cl @xin9le いやVM側でawaitとかないです。VM側は常になげっぱじゃないと、Mの例外がシステム例外が業務例外かのハンドリングをVMですることになるじゃないですか。Mの中でawaitしてるからしかたなくMの表面にasync付くことがあるくらいです。

2014-12-11 15:13:58
尾上 雅則 @ugaya40

@masaru_b_cl @xin9le そもそもVM側にMの例外や戻り値が戻ることにデメリットはあってもメリットがないです。

2014-12-11 15:14:31
白い高野さん @masaru_b_cl

@ugaya40 @xin9le あ、勘違いしてました。async voidなメソッドならawait付けなくても呼び出せますものね。

2014-12-11 15:17:23
neuecc @neuecc

あくまでvoidのかわりのTask(無印)というイメージで組み立てたほうがいいと思うけれど。Taskは戻り値を返す、という意味ではない。

2014-12-11 15:19:01
neuecc @neuecc

利用する際の実質的な意味ではasync voidである、というのは同意シマスガ。

2014-12-11 15:19:52
尾上 雅則 @ugaya40

@neuecc async void 非推奨な流れは知っていますので、だからこそ正直相性の悪さを感じがちですね。。。

2014-12-11 15:22:27
尾上 雅則 @ugaya40

async voidとasync Taskについてvoidの悪さ知りながらTaskもなぁって言っているのは、まぁ単純にメソッドシグネクチャの情報量減るのでそう考えるとそもそもそこ無理にasync使うところか?って思うわけです。

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

@neuecc @ugaya40 @xin9le 仮にvoidでなくTaskにするばあい、Mの処理の最後にawait Task.FromResult(0);みたいなのが必要になるわけですよね?(.NET 4.6だとTask.Completedが使える?)

2014-12-11 15:25:27
neuecc @neuecc

@ugaya40 エンジンがawaitを可能にするかしないかってぐらいだと思いますけどねー。相性が悪いのだとしたら、それはasync以前のエンジンのせいなので改善してもらわないと(旧ASP.NET MVCもそんな感じで一部相性の悪さが残ってた)

2014-12-11 15:26:29
白い高野さん @masaru_b_cl

@ugaya40 @neuecc @xin9le あっ、ホントだ!async/awaitの理解が浅い……

2014-12-11 15:27:25
尾上 雅則 @ugaya40

@neuecc エンジンというか、クラス呼び出しの連鎖の中で、同期と非同期の境界で、意味的にはvoidにしたいのにTaskにすることでメソッドシグネクチャから情報量が欠落(増える)しますよね。それってasync/await自体が抱えてる問題じゃないでしょうか。

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

先日もこれちょっとだけ???ってなったところだし

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

Task≒待ち合わせ可能、ではないことが混乱の元?

2014-12-11 15:32:31
neuecc @neuecc

@ugaya40 UnitとTaskに違いありますかねえ。async voidとvoidの違いは、voidは例外が伝搬されますがasync voidは虚空の彼方に消える。async Taskのほうがvoidの近い印象ですね、同期と非同期の最後の境界をエンジンが処理すれば、ですが。

2014-12-11 15:34:04
neuecc @neuecc

@ugaya40 async voidと書くのは、書き手が自分で明示的に境界を打ち切ること。async Taskと書くのは、その先に委ねること。非同期の連鎖(と実行効率)のなかでは、境界は引き伸ばしたほうがいいと思ってます。

2014-12-11 15:36:13
白い高野さん @masaru_b_cl

(しめしめ、殴り合いが始まったぞ

2014-12-11 15:37:09
前へ 1 2 ・・ 6 次へ