そこで、私は同僚とファイバーについてチャットしていて、ファイバーAPIを使用したC#でのコルーチンの実装について説明している2003年の論文を発表しました。
このホワイトペーパーでの実装はYield
.NET1.1用であったため、.NET2.0yield return
に登場した構文よりも前のものです。
一見すると、ここでの実装は潜在的に高速であり、複数のCPU間でかなりうまく拡張できるように見えます。
誰かがそれを使用しましたか?
使ったことはありませんが、興味があります。ラウンドロビンスケジューラを使用したC#でのコルーチンの優れた実装は次のとおりです。http ://www.bluebytesoftware.com/blog/PermaLink.aspx?guid = 71235c5a-3753-4bab-bdb0-334ab439afaf
ちなみに、ウィキペディアを引用すると、「繊維は本質的にコルーチンと同じ概念を説明しています」。私の知る限り、C#のコルーチン(またはファイバー)に最も近いのはイテレーターです。実際、それらはコルーチンに非常に近いです。Lippertは、イテレータに関するいくつかのキャッチを投稿しました。うまくいけば、それらのどれもあなたが必要とする目的のための深刻な問題を表していない。
私は歩留まりベースの「コルーチン」を使用しましたが、それはお尻の痛みだと言わざるを得ません。もちろん、問題は、それらを使用したいすべての場所で、yield構文を使用せざるを得ないことです。それだけでなく、利回りを連鎖させない限り(親は子の利回りを譲ります)、コルーチンを1レベルの深さまでしかネストできません。これにより、コルーチンの主要な利点の1つが完全に破壊されます(フルスタックの保存/復元)。
私はC#でファイバーベースのコルーチンシステムを実装しましたが、例外が発生するまではうまく機能しました。残念ながら、.NetランタイムはOSスレッドに多数の内部例外を格納します。つまり、OSファイバー(およびp / invoke)を使用して複数のスレッドをエミュレートすることは、例外が発生しない限り機能しません。
コルーチンは、一見したところ私の注意を引きます。数日前、私は並列AsyncWCFメソッド呼び出しのワークフローソリューションを探していましたが、私が見つけたものは本当に魅力的でした。
http://csharperimage.jeremylikness.com/2010/03/sequential-asynchronous-workflows-in.html
この記事では、非同期パターンを使用してWCFを使用するSilverlightアプリケーションでワークフローを作成/管理するためのコルーチンの非常に優れた使用法を示します。
イテレータの速度はわかりませんが、通常のサブルーチンではタスクを並行して実行する余裕がないミッションクリティカルなタスクで非常に役立つ高度な形式のサブルーチンのようなものです。