使用C#多線程處理同一批數據可以通過以下步驟實現:
創建一個數據集合,包含要處理的數據。例如,可以使用List
創建一個線程池,用于處理數據。可以使用ThreadPool類來創建線程池,例如使用ThreadPool.QueueUserWorkItem方法。
將數據集合分割成多個子集,每個子集包含一部分數據。可以使用LINQ的Skip和Take方法來分割數據集合。
使用多個線程并行處理每個子集的數據。在每個線程中,使用循環遍歷子集的每個數據,并進行相應的處理操作。
下面是一個簡單的示例代碼:
using System;
using System.Collections.Generic;
using System.Threading;
class Program
{
static void Main()
{
// 創建數據集合
List<int> data = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 創建線程池,用于處理數據
int maxThreads = Environment.ProcessorCount; // 獲取可用的處理器核心數
using (var countdown = new CountdownEvent(maxThreads)) // 使用CountdownEvent來等待所有線程完成
{
int batchSize = data.Count / maxThreads; // 計算每個線程處理的數據量
// 將數據集合分割成多個子集
for (int i = 0; i < maxThreads; i++)
{
int startIndex = i * batchSize;
int endIndex = (i == maxThreads - 1) ? data.Count : (i + 1) * batchSize;
// 使用線程池處理每個子集的數據
ThreadPool.QueueUserWorkItem(state =>
{
try
{
// 處理子集的數據
for (int j = startIndex; j < endIndex; j++)
{
int value = data[j];
// 進行相應的處理操作
Console.WriteLine("Processing data: " + value);
}
}
finally
{
countdown.Signal(); // 通知CountdownEvent一個線程已完成
}
});
}
countdown.Wait(); // 等待所有線程完成
}
}
}
在上述示例代碼中,將數據集合分割成了與處理器核心數相等的子集。每個子集由一個線程來處理,通過線程池來管理線程。每個線程通過循環遍歷子集的數據,并進行相應的處理操作。在主線程中使用CountdownEvent來等待所有線程完成。