2

私の C# アプリケーションには、キーワードに応答する共有リソース (テキスト プロセッサ クラス) の静的コレクションがあります。各プロセッサはステートフルであるため、マルチスレッド コンテキストでは機能しません。スレッドセーフにアクセスできるように、これらを整理する良い方法を探しています。

たとえば、各プロセッサに同期オブジェクトを埋め込むことができます

public abstract class TextProcessor
{
    protected internal readonly object sync = new object();

    public abstract void Run( string text );
}

public class DocumentProcessor
{
    private static Dictionary<string,TextProcessor> s_procMap = ...;

    public void Run( string [] words1, string[] words2 )
    {
        ThreadPool.QueueUserWorkItem( Process, words1 );
        ThreadPool.QueueUserWorkItem( Process, words2 );
    }

    private void Process( object arg )
    {
        foreach( var word in words )
        {
            var proc = s_processor[word];
            lock( proc.sync )
            {
                proc.Run( word );
            }
        }
    }

プロセッサをステートレスに書き換えることができないと仮定すると (これはオプションですが、リファクタリングの量が多いため最後の手段になります)、これを表現するより良い方法はありますか?

4

2 に答える 2

1

本当にプロセッサを変更したくない場合は、ラッパーを作成します。

public class ProcWrapper
{
  private TextProcessor _proc;
  private ActionBlock<string> _actBlock;

  public ProcWrapper(TextProcessor proc)
  {
    _proc = proc;

    _actBlock = new ActionBlock<string[]>(word=>
    {
      _proc.Run(word);
    });
  }

  public void AddWord(string words)
  {
    _actBlock.Post(word);
  }

  public void WaitForCompletion()
  {
    _actBlock.Completion.Wait();
  }
}

以前と同じように使用します。

Dictionary<string,ProcWrapper> s_procMap = ...;

void Run( string [] words )
{
  // NOTE: This assumes the same thread will access s_procMap.
  foreach(var word in words)
    s_procMap[word].AddWord(word);
}

これはあなたが探しているものに近いと思います。

withの詳細については http://msdn.microsoft.com/en-us/library/hh228603.aspx を、詳細についてhttp://msdn.microsoft.com/en-us/library/hh194684.aspx参照に固有です。DataFlowTPLActionBlock<T>

于 2013-10-07T15:56:53.010 に答える