【F#部】

このエントリーをはてなブックマークに追加
1番組の途中ですがアフィサイトへの転載は禁止です

時々 1 つの言語の落とし穴を理解する最良の方法は、別の言語がそれらをどのように防いでいるかを参考に
することである。Real-World Functional Programmingの著者であるTomas Petricek氏は、非同期なC# コードに
見られる6つの一般的な誤りについて説明し、どのように F# がそれらの発生する可能性を少なくしているかを
示している。

彼のAsync in C# and F#: Asynchronous gotchas in C#という題名の記事を全て読むことを薦めるが、以下が
その概要である。

■Asyncは、非同期に動かない: 最初のawait ステートメントの後に出てきたコードだけが非同期に動く。

■結果を無視する: 関数によって返されるタスク上でawaitすることを忘れると、順番のでたらめな結果になる。

■Async void メソッド: “async Task”でなく“async void”を返す関数は、awaitできないので、結果を無視した
場合と同じ問題を起こすことになる。

■Async void ラムダ関数: これは、関数が Action delegateを受け付けて、 Func<…, Task> delegateを受け
付けない時に起こる。またしても、非同期関数はawaitされない。

■入れ子のタスク: “await Task.Factory.StartNew(async () => { await Task.Delay(1000); });” というステート
メント中の最初と2番目の await ステートメントは完全に無関係である。すなわち最初のawaitが2番目の
awaitの前に終了する。関連付けられた1000 msの遅延は、有効である。

■非同期に走らない: Task.Wait()を使うと、全コールスタックは、強制的に同期モードになる。

F#に不慣れな人は、F#の非同期ワークフローがTask と Task<T> 型をベースにしていないのを知って驚くだろう。
代わりに F# Async<T>として知られている独自の型を使っている。
http://www.infoq.com/jp/news/2013/04/async-csharp-fsharp
2番組の途中ですがアフィサイトへの転載は禁止です:2013/04/24(水) 10:06:41.11 ID:r8Se4E2R0
またまた、すっげーニッチなスレもあったもんだわ
3番組の途中ですがアフィサイトへの転載は禁止です:2013/04/24(水) 10:07:41.00 ID:1L97SsTA0
Fortran始まりすぎw
4番組の途中ですがアフィサイトへの転載は禁止です:2013/04/24(水) 10:08:15.74 ID:V0H7NPDIO
ocaml
5番組の途中ですがアフィサイトへの転載は禁止です:2013/04/24(水) 10:09:35.65 ID:ykWeLPHn0
そんなニッチな言語でスレが伸びるわけ無いだろ!いいかげんにしろ
6番組の途中ですがアフィサイトへの転載は禁止です:2013/04/24(水) 10:11:19.06 ID:Mlk5EutB0
何が問題なのかわかんねーな
7番組の途中ですがアフィサイトへの転載は禁止です:2013/04/24(水) 10:12:46.59 ID:weSvr9uD0
えーと・・・
んじゃノシ
8番組の途中ですがアフィサイトへの転載は禁止です:2013/04/24(水) 10:17:23.18 ID:8IrMr7ky0
9番組の途中ですがアフィサイトへの転載は禁止です:2013/04/24(水) 10:19:41.68 ID:PN8a9VxL0
Fよりちょっと握りやすいよね
10番組の途中ですがアフィサイトへの転載は禁止です:2013/04/24(水) 10:21:37.41 ID:cJUXOI1p0
岡村みたいな名前の奴はちょっといじってみたことはあるけどそれ関係だっけ?
11番組の途中ですがアフィサイトへの転載は禁止です:2013/04/24(水) 10:23:47.63 ID:Mlk5EutB0
awaitすることを忘れると同期になるんだから
順番のでたらめな結果になることはないんじゃないのか
意味がわからん
await使わずに非同期メソッドを使った場合のことだろ
タスクファクトリー使った方が分かりやすいよね