私はparrallelのテキストの複数の箇所から単語を数える方法を持つC#ライブラリを作成しました。テキストのパッセージは文字列として与えられ、getnextchar()
が呼び出されるたびにランダムな遅延があります。私のライブラリメソッドは、これらの文字ストリームの配列を取って、結合された単語頻度カウントを返す必要があります。これを行うために、私は安全に共有された単語頻度データ構造と各文字ストリームを読み、共有コレクションを更新するためのスレッドを持っています。すべてのスレッドが完了したら、データ構造をクライアントアプリケーションに返します。C#スレッドプールからの暫定結果をクライアントアプリケーションにコールバックする最良の方法
クライアントアプリケーションでは、結合された単語の中間結果が10秒ごとに必要です。これを行うには、デリゲートを使用して、すべてのワーカースレッドが完了するまで結果をクライアントに10秒ごとにコールバックします。その後、クライアントに最終結果を返します。
私の問題は、中間結果でクライアントをコールバックするときに共有データ構造をロックし、クライアントアプリケーションがコールバックから戻ってロックを解除できるようにするまで待つことです。コールバックが実行されている間、すべてのワーカースレッドはブロックされ、データ構造のロックを待機します。これは、賢明なもののように見えません。なぜなら、クライアントコードを即座に、あるいはまったく返すことに頼るべきではないと思うからです。しかし、私はクライアントコードに依存しない、それをやっていると考えることができる他の方法は、私のデータ構造のコピーやスナップショットを作成し、それをコールバックを介してクライアントに渡すことです。これはメモリと計算を犠牲にしていますが、コピーが作成されると、ワーカーは共有コレクションの更新を継続でき、コールバックは必要なものを何でも実行できます。
1)労働者をブロックするために、悪いクライアントコールバックの実装の可能性を可能、または定期的に高価な操作を行って、2つの悪の小さい方です:
は、私の質問は2倍です。
2)上記のいずれにも該当しないこの問題を解決する方法はありますか?
お返事ありがとうございます。この練習の全体的なポイントは、quailityコードを書くことの原則を示すことであり、私はいつも早期の最適化がすべての悪の根源であると教えられていたので、スナップショットメソッドを使用します。 :) –