C# Task 应用实例详解
什么是 Task?
Task 是 .NET Framework 中提供的一种异步编程模式,它可以将方法的执行放到另一个线程中,不会阻塞当前线程的执行,从而提高应用的响应速度和性能。Task 中的一个最重要的概念就是任务(Task),即异步执行的一项工作,它可以返回值、抛出异常和进行其他处理。
Task 的使用方法
创建 Task
Task 可以使用 Task 类的静态方法创建、使用 Lambda 表达式创建、使用 async/await 关键字创建等多种方式创建。
使用 Task 类的静态方法创建
Task t1 = Task.Run(() =>
{
Console.WriteLine("Task 1 执行中...");
});
使用 Lambda 表达式创建
Task<int> t2 = new Task<int>(() =>
{
Console.WriteLine("Task 2 执行中...");
return 123;
});
t2.Start();
使用 async/await 关键字创建
async Task<string> TestAsync()
{
Console.WriteLine("TestAsync 执行中...");
await Task.Delay(1000);
return "TestAsync 执行完成";
}
Task 间协作
Task 可以通过一些方法实现和协作和等待。如 ContinueWith
、WaitAny
、WaitAll
等。
ContinueWith
Task t1 = Task.Run(() =>
{
Console.WriteLine("Task 1 执行中...");
});
Task t2 = t1.ContinueWith((task) =>
{
Console.WriteLine("Task 2 执行中...");
});
WaitAny
Task t1 = Task.Run(() =>
{
Console.WriteLine("Task 1 执行中...");
});
Task t2 = Task.Run(() =>
{
Console.WriteLine("Task 2 执行中...");
});
var tasks = new Task[] { t1, t2 };
int index = Task.WaitAny(tasks);
Console.WriteLine("第 {0} 个任务完成。", index + 1);
WaitAll
Task t1 = Task.Run(() =>
{
Console.WriteLine("Task 1 执行中...");
});
Task t2 = Task.Run(() =>
{
Console.WriteLine("Task 2 执行中...");
});
var tasks = new Task[] { t1, t2 };
Task.WaitAll(tasks);
Console.WriteLine("所有任务完成。");
Task 应用实例
示例一:批量下载文件
假设有一个需要下载的文件列表,任务是使用多线程的方式并发下载这些文件。
using System.Net;
using System.Diagnostics;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
var urls = new[]
{
"https://storage.googleapis.com/golang/go1.9.7.windows-amd64.msi",
"https://storage.googleapis.com/golang/go1.8.7.windows-amd64.msi",
"https://storage.googleapis.com/golang/go1.7.6.windows-amd64.msi",
"https://storage.googleapis.com/golang/go1.6.4.windows-amd64.msi",
"https://storage.googleapis.com/golang/go1.5.4.windows-amd64.msi"
};
var sw = Stopwatch.StartNew();
var tasks = new Task[urls.Length];
for (int i = 0; i < urls.Length; i++)
{
tasks[i] = Task.Run(() =>
{
WebClient client = new WebClient();
client.DownloadFile(urls[i], urls[i].Split('/').Last());
Console.WriteLine("{0} 下载完成。", urls[i].Split('/').Last());
});
}
Task.WaitAll(tasks);
sw.Stop();
Console.WriteLine("{0} 秒后下载完成。", sw.ElapsedMilliseconds / 1000f);
}
}
示例二:批量转码视频
假设有一个视频列表,任务是使用多线程的方式并发转码这些视频。
using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
var videos = new[]
{
"video1.mp4",
"video2.mp4",
"video3.mp4",
"video4.mp4",
"video5.mp4"
};
var sw = Stopwatch.StartNew();
var tasks = new Task[videos.Length];
for (int i = 0; i < videos.Length; i++)
{
tasks[i] = Task.Run(() =>
{
var input = videos[i];
var output = input.Replace(".mp4", ".avi");
var arguments = string.Format("-i {0} -c:v libx264 -c:a libmp3lame -s 640x480 -preset:v ultrafast -tune:v animation -b:v 1000K -threads 0 -y {1}", input, output);
var process = Process.Start(Path.Combine(Environment.CurrentDirectory, "ffmpeg.exe"), arguments);
process.WaitForExit();
Console.WriteLine("{0} 转码完成。", input);
});
}
Task.WaitAll(tasks);
sw.Stop();
Console.WriteLine("{0} 秒后转码完成。", sw.ElapsedMilliseconds / 1000f);
}
}
总结
Task 作为 .NET Framework 中异步编程模式的一种实现,可以显著提高应用程序的响应速度和性能。通过 Task 的多种创建方式和协作方法,可以实现更复杂的任务处理和异步编程,同时还可以提高代码的可读性和可维护性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# task应用实例详解 - Python技术站