Skip to content

多线程Thread执行任务

约 595 字大约 2 分钟

c#多线程

2025-10-10

如何将一个任务分配给多个线程去执行?

为了提升效率,优化用户等待时间,我们可以把一个任务分配给多个线程去执行。如下面模拟场景:

计算整数类型数组的总和

现在我需要计算一个整数型数组的成员的总和。主线程去执行的话,是这样操作的:

int[] arry = {1,2,3,4,5,6,7,8,9,10};
int sum = 0; // 总和
var startTime = DateTime.Now; // 开始时间
// 计算数组总和
foreach (int i in arry)
{
    sum += i;
    Thread.Sleep(100); // 添加延迟
}
var endTime = DateTime.Now; // 结束时间
var timeSpan = endTime - startTime; // 间隔时间,即任务时间
Console.WriteLine($"数组arry的成员总和:{sum}");
Console.WriteLine($"任务时间:{timeSpan.TotalMilliseconds} 毫秒");

单线程需要的时间

主线程去计算,需要花费大约1037毫秒的时间。

单线程计算数组总和

如何多线程去计算呢?

比如,用4个线程去执行计算任务,那如何分配任务给每个线程呢?方法就是,将数组分段计算。如下:

int[] arry = {1,2,3,4,5,6,7,8,9,10};           
var startTime = DateTime.Now; // 开始时间        

// 分段计算函数
int sumFunction(int start, int end)
{
    int sum = 0;
    for (int i = start; i < end; i++)
    {
        sum += arry[i];
        Thread.Sleep(100); // 添加延迟
    }
    return sum; 
}

// 4个线程
int threadCount = 4;
Thread[] threads = new Thread[threadCount];
int segment = arry.Length / threadCount; // 给每个线程分配计算数量
// 给每个线程分配任务
int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0;
threads[0] = new Thread(() => { sum1 = sumFunction(0, segment); });
threads[1] = new Thread(() => { sum2 = sumFunction(segment, segment*2); });
threads[2] = new Thread(() => { sum3 = sumFunction(segment*2, segment*3); });
threads[3] = new Thread(() => { sum4 = sumFunction(segment*3, arry.Length); });
// 线程开始
foreach (var t in threads)
{
    t.Start();
}
// 阻塞线程以获得总和结果
foreach (var t in threads)
{
    t.Join();
}

var endTime = DateTime.Now; // 结束时间
var timeSpan = endTime - startTime; // 间隔时间,即任务时间
Console.WriteLine($"数组arry的成员总和:{sum1 + sum2 + sum3 + sum4}");
Console.WriteLine($"任务时间:{timeSpan.TotalMilliseconds} 毫秒");

多线程需要的时间

4个线程去执行任务,需要大约440毫秒

多线程计算数组总和.png

本博客采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可