C#并行库Task类介绍
什么是Task类?
在C#并行编程中,Task类是一个重要的类,它代表一个异步操作,可以理解为对一个方法的异步调用,并且可以获取异步操作的状态和结果。
Task类的使用
创建Task对象
Task类有多种构造函数,最基本的构造函数如下所示:
Task task = new Task(Action action);
其中,action表示异步执行的方法。
例如,我们可以创建一个简单的任务,输出一个文字:
Task task = new Task(() => Console.WriteLine("Hello World"));
启动Task对象
Task类提供了三个方法,分别是Start、RunSynchronously和Wait,用于启动Task对象。其中,Start方法和RunSynchronously方法都是异步启动任务,不同之处在于Start方法会在后台线程中启动Task对象,而RunSynchronously方法会在当前线程启动Task对象。
例如,我们可以先创建一个Task对象,再通过Start方法启动它:
Task task = new Task(() => Console.WriteLine("Hello World"));
task.Start();
或者使用RunSynchronously方法启动它:
Task task = new Task(() => Console.WriteLine("Hello World"));
task.RunSynchronously();
获取Task对象的状态和结果
Task类提供了一些方法,用于获取Task对象的状态和结果,包括IsCompleted、IsCanceled、IsFaulted、Wait和Result等方法。
例如,我们可以先创建一个返回int类型的Task对象,再使用Wait方法等待其完成并获取其结果:
Task<int> task = new Task<int>(() =>
{
Console.WriteLine("Task is running.");
return 100;
});
task.Start();
task.Wait();
int result = task.Result;
Console.WriteLine("Task result is {0}", result);
Task的链式调用
Task类还支持链式调用,即在一个Task执行完成后接着启动另一个Task。例如:
Task<int> task1 = new Task<int>(() =>
{
Console.WriteLine("Task 1 is running.");
return 1;
});
Task<int> task2 = task1.ContinueWith(preTask =>
{
int result = preTask.Result;
Console.WriteLine("Task 2 is running, previous task result is {0}.", result);
return result + 1;
});
task1.Start();
task2.Wait();
int finalResult = task2.Result;
Console.WriteLine("The final result is {0}", finalResult);
Task并行执行
Task并行执行是提高程序效率的一种方法。例如,我们可以通过Task类并行执行多个方法:
Task task1 = new Task(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Task 1 is running, i = {0}.", i);
Thread.Sleep(500);
}
});
Task task2 = new Task(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Task 2 is running, i = {0}.", i);
Thread.Sleep(500);
}
});
Task task3 = new Task(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Task 3 is running, i = {0}.", i);
Thread.Sleep(500);
}
});
task1.Start();
task2.Start();
task3.Start();
Task.WaitAll(task1, task2, task3);
小结
Task类是C#并行编程中的重要类,它代表着一个异步操作,可以通过Start方法启动,通过Wait方法等待其完成并获取结果。Task类还支持链式调用和并行执行。在实际开发中,灵活运用Task类可以提高程序效率。
示例一
下面是一个使用Task类执行并发操作的示例,我们从一个数组中查找最大值和最小值:
int[] array = new int[] {1, 5, 3, 7, 2, 6, 4, 9, 8};
Task<int> findMaxTask = new Task<int>(() =>
{
Console.WriteLine("Finding max value ...");
return array.Max();
});
Task<int> findMinTask = new Task<int>(() =>
{
Console.WriteLine("Finding min value ...");
return array.Min();
});
findMaxTask.Start();
findMinTask.Start();
Task.WaitAll(findMaxTask, findMinTask);
int maxValue = findMaxTask.Result;
int minValue = findMinTask.Result;
Console.WriteLine("Max value is {0}, min value is {1}.", maxValue, minValue);
运行以上代码,输出如下:
Finding min value ...
Finding max value ...
Max value is 9, min value is 1.
示例二
下面是一个使用Task类模拟多个用户并发请求的示例,我们通过一个Task数组模拟3个用户同时向服务器请求数据。每个线程请求返回后,会输出请求结果和线程的ID。
Task[] tasks = new Task[3];
for (int i = 0; i < tasks.Length; i++)
{
int id = i;
tasks[i] = new Task(() =>
{
Console.WriteLine("Thread {0} is requesting data...", id);
Thread.Sleep(1000);
Console.WriteLine("Thread {0} request data completes, data is {1}.", id, Guid.NewGuid().ToString("N"));
});
}
foreach (Task task in tasks)
{
task.Start();
}
Task.WaitAll(tasks);
运行以上代码,输出如下:
Thread 0 is requesting data...
Thread 1 is requesting data...
Thread 2 is requesting data...
Thread 2 request data completes, data is e9730f87e6d84d4c96fe6c4b93f74369.
Thread 0 request data completes, data is 5fa1f1e7c7b44ad89d4c45a91fc5eb30.
Thread 1 request data completes, data is 8201f86a726643f6a4b1e5eddbd88bdc.
以上就是关于C#并行库Task类的详细介绍及示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#并行库Task类介绍 - Python技术站