使用 Task 代替 ThreadPool
🏷️ C#
ThreadPool
相对于 Thread
具有很多优势,但是 ThreadPool
在使用上却有一定的不方便。
ThreadPool
不支持线程的取消、完成、失败通知等交互性操作ThreadPool
不支持线程执行的先后顺序
FCL
中提供了一个更强大的概念:Task
。Task
在线程池的基础上进行了优化,并提供了更多的 API。
示例 1(完成通知)
cs
using System;
using System.Threading;
using System.Threading.Tasks;
namespace TaskSample
{
class Program
{
static void Main(string args)
{
Task t = new Task(() =>
{
Console.WriteLine("任务开始工作");
// 模拟工作过程
Thread.Sleep(5000);
});
t.Start();
t.ContinueWith((task) =>
{
Console.WriteLine("任务完成,完成时候的状态为:");
Console.WriteLine("IsCanceled={0}\tIsCompleted={1}\tIsFaulted={2}",
task.IsCanceled,
task.IsCompleted,
task.IsFaulted);
});
Console.ReadLine();
}
}
}
示例 1 输出结果
任务开始工作
任务完成,完成时候的状态为:
IsCanceled=False IsCompleted=True IsFaulted=False
示例 2(完成通知、取消、获取任务返回值)
cs
using System;
using System.Threading;
using System.Threading.Tasks;
namespace TaskSample2
{
class Program
{
static void Main(string args)
{
CancellationTokenSource cts = new CancellationTokenSource();
Task<int> task = new Task<int>(() => Add(cts.Token), cts.Token);
task.Start();
task.ContinueWith(TaskEnded);
// 等待按任意键取消任务
Console.ReadKey();
cts.Cancel();
Console.ReadKey();
}
static int Add(CancellationToken ct)
{
Console.WriteLine("任务开始 ......");
int result = 0;
while (!ct.IsCancellationRequested)
{
result++;
Thread.Sleep(100);
}
return result;
}
static void TaskEnded(Task<int> task)
{
Console.WriteLine("任务完成,完成时候的状态为:");
Console.WriteLine("IsCanceled={0}\tIsCompleted={1}\tIsFaulted={2}",
task.IsCanceled,
task.IsCompleted,
task.IsFaulted);
Console.WriteLine("任务的返回值为:{0}", task.Result);
}
}
}
示例 2 输出结果
任务开始 ......
任务完成,完成时候的状态为:
IsCanceled=False IsCompleted=True IsFaulted=False
任务的返回值为:30