C〓〓マルチスレッド処理Listデータ

2474 ワード

コードの考え方
処理するデータをConcurrentQueueにおいて、複数のスレッドを開いてデータを処理し、処理が完了したら次の処理対象データをキューに取得する.ConcurrentQueue は、スレッドセキュリティの先発的なセット(FIFO)を表し、System.Collections.Concurrentの名前空間に属するデータ構造である.
直接コード
/// 
///        (    )
/// 
///     
///      
///       (       )
///       
///         
static void RunTask(List list, Action action, int threadCount = 5, bool waitFlag = true)
{
    ConcurrentQueue queue = new ConcurrentQueue(list);
    Task[] tasks = new Task[threadCount];
    for (int i = 0; i < threadCount; i++)
    {
        tasks[i] = Task.Run(() =>
          {
              while (queue.TryDequeue(out T t))
              {
                  action(t);
              }
          });
    }
    if (waitFlag)
    {
        Task.WaitAll(tasks);
    }
}

/// 
///        (       )
/// 
///     
///      
///       (       )
///       
///        
static List RunTask(List list, Func func, int threadCount = 5)
{
    var result = new List();
    ConcurrentQueue queue = new ConcurrentQueue(list);
    Task>[] tasks = new Task>[threadCount];
    for (int i = 0; i < threadCount; i++)
    {
        tasks[i] = Task.Run>(() =>
        {
            var rList = new List();
            while (queue.TryDequeue(out T t))
            {
                rList.Add(func(t));
            }
            return rList;
        });
    }
    Task.WaitAll(tasks);
    for (int i = 0; i < threadCount; i++)
    {
        result.AddRange(tasks[i].Result);
    }
    return result;
}
呼び出し方法
List list = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//        ,   “action”    
RunTask(list, d => { Console.WriteLine("action" + d); });

//          “*2”    
var result = RunTask(list, d => { return d * 2; });
result.ForEach(d => Console.WriteLine(d));
最後の言葉
上のコードはデータの処理を簡単に実現しただけで、メモリの使用制限を考慮していません.一般的な項目で使用してもいいです.最後に、100 Mのリストを作成し、ConcurrentQueueにロードして、モニタプログラムのメモリが占有されています.大きなメモリ占有の変化がないことが分かりました.