48

私はc#でコルーチン(ユーザーがスケジュールしたスレッド)を実装する方法を探しています。C ++を使用するとき、私はファイバーを使用していました。インターネットでは、C#にはファイバーが存在しないことがわかります。同様の機能を取得したいのですが。

C#でコルーチンを実装する「正しい」方法はありますか?

コルーチンごとにこのミューテックスを解放するスケジューラスレッドで単一の実行ミューテックス+1を取得するスレッドを使用してこれを実装することを考えました。しかし、これは非常にコストがかかるようです(各コルーチン間でコンテキストスイッチを強制します)

イールドイテレータ機能も見てきましたが、私が理解しているように、内部関数内ではイールドできません(元のイテレータ関数でのみ)。だから、これは私には少し良いことです。

4

6 に答える 6

13

編集:これらを使用できるようになりました: .netにファイバーAPIはありますか?

.NETのリアクティブ拡張機能を確認する必要があると思います。たとえば、コルーチンはイテレータとyieldステートメントを使用してシミュレートできます。

ただし、このSOの質問も読みたいと思うかもしれません。

于 2010-04-08T11:28:48.053 に答える
13

新しい .NET 4.5\C# 5 では、async\await パターンがニーズを満たすはずです。

async Task<string> DownloadDocument(Uri uri)
{  
  var webClient = new WebClient();
  var doc = await webClient.DownloadStringTaskAsync(url);
  // do some more async work  
  return doc;  
}  

詳細については、 http://channel9.msdn.com/Events/TechEd/Australia/Tech-Ed-Australia-2011/DEV411を参照することをお勧めします。素晴らしいプレゼンテーションです。

また、 http://msdn.microsoft.com/en-us/vstudio/gg316360にもすばらしい情報があります。

古いバージョンの .NET を使用している場合は、古い .NET で使用できる Async CTP があり、本番環境で使用できるようになります。CTP http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=9983へのリンクは次のとおりです。

上記のオプションのいずれも気に入らない場合は、ここで概説されている非同期反復子パターンに従うことができると思います。 http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=9983

于 2012-04-08T15:53:55.910 に答える
6

スレッドを使用してコルーチンを実装する例を次に示します

だから私はごまかします。私はスレッドを使用していますが、一度に実行できるのは1つだけです。コルーチンを作成するときは、スレッドを作成してから、Monitor.Wait()の呼び出しで終了するハンドシェイクを実行します。これにより、コルーチンスレッドがブロックされます。ブロックが解除されるまで実行されなくなります。コルーチンを呼び出すときは、呼び出しスレッドがブロックされ、コルーチンスレッドが実行可能になるハンドオフを実行します。帰りに同じ種類のハンドオフ。

これらのハンドオフは、他の実装と比較して、一種の費用がかかります。速度が必要な場合は、独自のステートマシンを作成し、このコンテキスト切り替えをすべて回避する必要があります。(または、ファイバー対応のランタイムを使用することをお勧めします。ファイバーの切り替えはかなり安価です。)しかし、表現力豊かなコードが必要な場合は、コルーチンがある程度有望だと思います。

于 2010-04-08T11:34:59.640 に答える