2009-12-10 10 views
7

私はfibersについて同僚とチャットしており、Fiber APIを使用してC#でコルーチンの実装を記述したthis paper from 2003となっています。C#のファイバー:イテレーターよりも高速で、人々に使用されていますか?

このホワイトペーパーのYieldの実装は、.NET 1.1用であったため、.NET 2.0に登場するyield returnの構文よりも前です。

ここでの実装は潜在的に高速で、複数のCPUにまたがって拡張できることは間違いなく一目瞭然です。

誰でも使ったことがありますか?

+2

私はそれを使っていませんが、私はそのテーマに興味があります。ここでは、ラウンドロビンスケジューラを使ってC#でコルーチンを実装しています。http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=71235c5a-3753-4bab-bdb0-334ab439afaf – jpbochi

+2

ところで、どのような答えをしますかあなたはこの質問を期待していますか? – jpbochi

+0

私はそれを使用していませんが、記事は面白かったです。問題は、これが現在Windowsで主に実装されているようだということです。 –

答えて

7

私はそれを使っていませんが、私はそのテーマに興味があります。ここではコルーチンの1つのすてきな実装は、ラウンドロビンスケジューラとC#である:http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=71235c5a-3753-4bab-bdb0-334ab439afaf

ところで、wikipediaを引用し、「繊維はコルーチンと本質的に同じ考え方を説明し」。私が知る限り、C#のコルーチン(またはファイバ)に最も近いのはイテレータです。実際、彼らはコルーチンに非常に近いです。 Lippertはイテレータについていくつかのキャッチを投稿しました。うまくいけば、それらのどれもあなたが必要とする目的のために深刻な問題を表明しません。

6

私は歩留まりに基づいた "コルーチン"を使用していますが、それらはお尻の痛みだと言わなければなりません。問題は、もちろん、それらを使用したい場所であれば、yield文法を使用する必要があるということです。それだけでなく、連鎖収量(親は収量を得る)をしなければ、あなたのコルーチンを1レベル深く入れ子にすることができます。これにより、コルーチンの主な利点の1つ(完全なスタック保存/復元)が完全に破棄されます。

C#でファイバーベースのコルーチンシステムを実装しましたが、例外が発生するまではすばらしく働いていました。残念なことに.NetランタイムはOSスレッドに複数の内部例外を格納しています。つまり、OSファイバー(およびp/invoke)を使用して複数のスレッドをエミュレートすることは、決して例外がない限り機能しません。 parrallel AsyncWCFメソッドが呼び出され、どのような私が見つけたことは本当に魅力的だったため

+0

アンマネージコードでの例外処理の不足を回避するには、yieldの前にすべてのマネージコードをtry/catchで追加しますか? – Contango

+1

この回答は重要です。つまり、生産にファイバーベースのコルーチンを使用することは決してできません。 – usr

+0

実際には、あなたの実行を入れ子にして、実行したときに処理された例外と未処理の例外を同様にサポートし、処理されなかったときだけ例外を完全に伝播する必要があることを意味します。例外に基づくプログラミングのコンセプトは、ファイバーの概念または適切な派生物によってもサポートされるべきです。 – Jay

1

コルーチンは、非常に一目見ただけで私の注意をキャッチ..何日か前、私は、ワークフローソリューションを探していた。

http://csharperimage.jeremylikness.com/2010/03/sequential-asynchronous-workflows-in.html

この記事では、Aを示し非同期パターンを使用してWCFを使用するSilverlightアプリケーションでワークフローを作成/管理するためのコルーチンの使用

イテレータのスピードはわかりませんが、通常のサブルーチンではタスクを並行して実行することができないミッションクリティカルなタスクで非常に役立つサブルーチンの高度なフォーム。

関連する問題