C#并行编程之Task任务
在C#中,任务(Task)是一种表示异步操作的对象,它可以在完成时返回一个结果,也可以不返回任何东西。任务可以被链接在一起,创建任务分组,以及异步等待多个任务的完成。
创建任务
在C#中,我们可以使用Task类创建异步任务。Task类有很多不同的构造函数,其中最常用的是接受一个Action委托的构造函数,如下所示:
Task task = new Task(() =>
{
// 这里是异步操作的代码
});
这将创建一个异步任务对象,该对象将执行Action委托中指定的方法。
我们也可以使用Task.Factory.StartNew()方法创建一个带有任务返回值的任务,例如:
Task<int> task = Task.Factory.StartNew(() =>
{
// 这里是异步操作的代码
// 返回一个int值
return 42;
});
处理任务完成事件
我们可以使用Task类的几个方法来处理任务完成事件。其中,最常用的方法是ContinueWith()。这个方法将在任务完成后执行指定的操作。例如:
Task task = new Task(() =>
{
// 这里是异步操作的代码
});
// 这个任务完成后将执行指定的操作
task.ContinueWith(t =>
{
// 这里是操作完成后的代码
});
task.Start();
在上面的代码中,任务完成后,ContinueWith()方法将执行传入的Action委托。
我们也可以创建一个带返回值的任务,并在任务完成后进行操作。例如:
Task<int> task = Task.Factory.StartNew(() =>
{
// 这里是异步操作的代码
// 返回一个int值
});
task.ContinueWith(t =>
{
// 这里是操作完成后的代码
int result = t.Result;
});
在上面的代码中,ContinueWith()方法将在任务完成后执行,t.Result将返回异步操作的结果。
处理多个任务
如果我们需要同时处理多个任务,我们可以创建一个任务数组并运行它们。我们可以使用Task.WaitAll()方法异步等待所有任务完成。例如:
Task[] tasks = new Task[3];
tasks[0] = Task.Factory.StartNew(() =>
{
// 这里是任务1的异步操作代码
});
tasks[1] = Task.Factory.StartNew(() =>
{
// 这里是任务2的异步操作代码
});
tasks[2] = Task.Factory.StartNew(() =>
{
// 这里是任务3的异步操作代码
});
Task.WaitAll(tasks);
// 所有任务完成后,执行这里的代码
在上面的代码中,Task.WaitAll()方法将异步等待所有任务完成。当所有任务都完成时,将执行注释部分的代码。
示例1:计算数字之和代码
下面是一个示例,使用任务计算一组数字的总和。
int[] data = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Task<int> task = Task.Factory.StartNew(() =>
{
int sum = 0;
foreach (int i in data)
{
sum += i;
}
return sum;
});
task.ContinueWith(t =>
{
int sum = t.Result;
Console.WriteLine($"sum={sum}");
});
在这个示例中,创建了一个任务来计算一组数字的总和。当任务完成时,输出计算得到的总和。
示例2:下载并合并多个文件代码
下面是另一个示例,使用多个任务下载并合并多个文件。
List<string> urls = new List<string>() { "url1", "url2", "url3" };
List<byte[]> fileDataList = new List<byte[]>();
List<Task> tasks = new List<Task>();
foreach (string url in urls)
{
Task task = Task.Factory.StartNew(() =>
{
// 下载文件数据
byte[] fileData = DownloadData(url);
lock (fileDataList)
{
// 将下载的文件数据加入到列表中
fileDataList.Add(fileData);
}
});
tasks.Add(task);
}
Task.WaitAll(tasks.ToArray());
// 将所有文件数据合并到一个大的文件数组中
byte[] mergedData = MergeData(fileDataList);
// 将合并后的数据写入文件
WriteMergedDataToFile(mergedData);
在这个示例中,使用多个任务下载一组文件,然后将所有文件数据合并到一个大的文件数组中,并将结果写入文件。任务使用线程安全技术,确保能正确地将文件数据添加到文件数据列表中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#并行编程之Task任务 - Python技术站