C〓〓マルチスレッド処理Listデータ
2474 ワード
コードの考え方
処理するデータを
直接コード
上のコードはデータの処理を簡単に実現しただけで、メモリの使用制限を考慮していません.一般的な項目で使用してもいいです.最後に、100 Mのリストを作成し、
処理するデータを
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
にロードして、モニタプログラムのメモリが占有されています.大きなメモリ占有の変化がないことが分かりました.