C#并行和多线程编程——认识和使用Task
在C#中,Task类是用来支持并行和多线程编程的。本文将详细介绍如何使用Task类。
Task的定义
Task类是C#中用来提供线程执行的工具类,使用Task,可以异步执行计算任务、并行处理集合等。Task可以并行执行多个任务,加快程序的执行速度,提高程序的响应速度。
Task的创建和使用
通过Task类创建的任务最终会在后台线程上运行。Task类有多种重载方法可以用来创建任务,最常用的有以下两种方式:
1.使用Task.Run方法
Task.Run方法可以用来开启一个新线程并在该线程上执行指定的任务,示例如下:
Task.Run(() => {
Console.WriteLine("这是一个在Task中执行的任务");
});
2.使用Task.Factory.StartNew方法
Task.Factory.StartNew方法可以用来启动一个新的线程并在该线程上执行指定的任务。示例如下:
Task.Factory.StartNew(() =>
{
Console.WriteLine("这是一个在Task中执行的任务");
});
Task的等待和取消
在执行任务的时候,有时候需要等待任务完成之后再继续执行下面的代码,此时可以使用Task.Wait方法。示例如下:
var task = Task.Factory.StartNew(() => {
Console.WriteLine("这是一个在Task中执行的任务");
Thread.Sleep(1000);
});
task.Wait();
Console.WriteLine("任务执行完成");
如果需要在某个时间点取消已经启动的任务,可以使用CancellationTokenSource类。示例如下:
var cancellationTokenSource = new CancellationTokenSource();
var task = Task.Factory.StartNew(() => {
Console.WriteLine("这是一个在Task中执行的任务");
while (true) {
if (cancellationTokenSource.IsCancellationRequested) {
cancellationTokenSource.Token.ThrowIfCancellationRequested();
}
// 此处处理任务逻辑
}
}, cancellationTokenSource.Token);
// 在某个时间点取消任务
cancellationTokenSource.Cancel();
Task的延续和子任务
当一个任务执行完成之后,需要执行另外一个任务,此时可以使用Task的延续方法。示例如下:
var task1 = Task.Factory.StartNew(() => {
Console.WriteLine("执行任务1");
});
var task2 = task1.ContinueWith(t => {
Console.WriteLine("任务1执行完成,执行任务2");
});
Task.WaitAll(task1, task2);
在执行任务的过程中,有时候需要启动多个子任务来完成复杂的逻辑处理,此时可以使用Task的子任务。示例如下:
var parentTask = Task.Factory.StartNew(() =>
{
Console.WriteLine("执行父任务");
var childTask1 = Task.Factory.StartNew(() => Console.WriteLine("执行子任务1"), TaskCreationOptions.AttachedToParent);
var childTask2 = Task.Factory.StartNew(() => Console.WriteLine("执行子任务2"), TaskCreationOptions.AttachedToParent);
var childTask3 = Task.Factory.StartNew(() => Console.WriteLine("执行子任务3"), TaskCreationOptions.AttachedToParent);
});
parentTask.Wait();
在上述案例中,父任务会启动3个子任务,并等待子任务执行完成之后再执行后续代码。
示例
使用Task并行统计1万个随机数中的奇偶数个数并输出。
var random = new Random();
var numbers = new int[10000];
for (int i = 0; i < numbers.Length; i++) {
numbers[i] = random.Next(1, 10000);
}
var oddCountTask = Task.Run(() => {
var count = numbers.Count(n => n % 2 == 1);
Console.WriteLine($"奇数的个数为{count}");
});
var evenCountTask = Task.Run(() => {
var count = numbers.Count(n => n % 2 == 0);
Console.WriteLine($"偶数的个数为{count}");
});
Task.WaitAll(oddCountTask, evenCountTask);
本示例中,使用Task并行计算数组中的奇偶数个数,既提高了计算的效率,又提高了程序的响应速度。
总结
本文介绍了使用C#中的Task类来支持并行和多线程编程的方法和技巧。通过Task,程序可以异步并行处理多个任务,提高程序的性能和响应速度。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 并行和多线程编程——认识和使用Task - Python技术站