2011-09-19 7 views
0

マルチスレッドコンテキストで(スレッドセーフな)静的メソッドを呼び出しますが、返されたエラーメッセージを何らかのリストに追加する必要があります。.NETで<4の単純なスレッドセーフリストオブジェクトが必要です

.NET 4では、ConcurrentDictionaryを使用できます。しかし、3.5でこれを実行する必要がある場合、以下のallMessagesオブジェクトの代替手段は何ですか?

using (var mre = new ManualResetEvent(false)) 
{ 
    for (int i = 0; i < max1; i++) 
    { 
      ThreadPool.QueueUserWorkItem(st => 
      { 
      for (int j = 0; j < max2; j++) 
      { 
       string errorMsg; 
       // Call thread-safe static method 
       SomeStaticClass.SomeStaticMethod(out errorMsg); 

       // Need to collect all errorMsg in some kind of threadsafe list 
       // allMessages.Add(errorMsg); 

      } 
      if (Interlocked.Decrement(ref pending) == 0) mre.Set(); 
      }); 
    } 
    mre.WaitOne(); 
} 

allMessages-オブジェクトは、可能な限りシンプルにすることができます - リストのいずれかの種類がそれを行うだろう、スレッドセーフな方法で文字列を充填することが可能です。

+2

通常のコレクションとロックを使用するのはどうですか? – CodesInChaos

+0

プライベートオブジェクトを使用する場合、thisLock = new Object();ロック(thisLock){allMessages.Add(errorMsg);}、それで十分でしょうか? – Olaf

+1

これが辞書にアクセスする唯一の方法(読み書きの両方)であれば十分です。 – CodesInChaos

答えて

1

ICollection<T>インターフェイスの独自の実装を作成できます。このインターフェイスでは、すべての呼び出しをタイプList<T>のプライベートメンバーに委任して、すべてのアクセスをロックで保護します。

など。

public class LockedCollection<T> : ICollection<T> 
{ 
    private readonly object _lock = new object(); 
    private readonly List<T> _list = new List<T>(); 

    public void Add(T item) 
    { 
     lock (_lock) 
     { 
     _list.Add(item); 
     } 
    } 

    // other members ... 

} 

「努力」(および維持するコード)の価値がある場合は、決定する必要があります。あなたは単にロック/モニタを使ってあなたのコールを「平らな」リストに保護することができます。

など。

  for (int j = 0; j < max2; j++) 
      { 
       string errorMsg; 
       // Call thread-safe static method 
       SomeStaticClass.SomeStaticMethod(out errorMsg); 

       lock (allMessageLock) // allMessagesLock is an "object", defined with the same lifetime (static- or instance-member) as "allMessages". 
       { 
        // Need to collect all errorMsg in some kind of threadsafe list 
        allMessages.Add(errorMsg); 
       } 
      } 
+0

ありがとうございます。あまりにも多くの努力をしていないようです。試してみましょう。 – Olaf

+0

クリスチャンの答えを拡張するには、単純なロックではなく、ReaderWriterLockSlimを使用して、コレクションからの読み取りを可能な限り速くしながら、書き込みがスレッドsfae – Johnv2020

関連する問題