一个Task表示一个异步操作,Task的创建和执行都是独立的,因此可以对关联操作的执行拥有完全的控制权。
一:Task的优势
1: Task支持线程的取消、完成、失败通知等交互性操作
2: Task支持线程执行的先后次序
Task t = new Task(() =>
{
});
t.ContinueWith((task) =>
{
});
t.Start();
二:Task的完成状态
任务Task有这样一些属性,让我们查询任务完成时的状态:
1: IsCanceled,因为被取消而完成
2: IsCompleted,成功完成
3: IsFaulted,因为发生异常而完成
CancellationTokenSource cts = new CancellationTokenSource();
Task<int> t = new Task<int>(() => Add(cts.Token), cts.Token);
t.Start();
t.ContinueWith(TaskEnded);
//等待按下任意一个键取消任务
Console.ReadKey();
cts.Cancel();
任务Task创建方式
方式一、new Task 无返回值
Task task = new Task(() =>{});
task.Start();
new Task 有返回值的方式,Task 与 ContinueWith
//先执行Task
Task<int> task = new Task<int>(() => {
return 0;
});
//其次执行ContinueWith
task.ContinueWith(t =>
{
int result = t.Result;
});
task.Start();
方式二、使用 TaskMethod 无返回值
Task task =
new
Task(() => TaskMethod(
"Task 2"
));
task.Start();
方式三、Task.Run
Task task = Task.Run(() => TaskMethod(
"Task 3"
));
方式四、直接异步的方法
Task.Factory.StartNew(() => TaskMethod(
"Task 3"
));
方式五、异步
Task.Run(async () =>
{
await Task.Factory.StartNew(() =>
{
});
});
Task任务并行
List<Task> taskList =
new
List<Task>();
taskList.Add(Task.Run(() =>
{
}));
taskList.Add(Task.Run(() =>
{
}));
taskList.Add(Task.Run(() =>
{
}));
//主线程阻塞,等待结束
Task.WaitAll(taskList.ToArray());
主线程 Code ....执行
方式三、异步非阻塞
Task[] tlist =
new
Task[] {
Task.Factory.StartNew(() => {
Thread.Sleep(3000);
}),
Task.Factory.StartNew(() => {
Thread.Sleep(90000);
})
};
Task.WhenAny(tlist).ContinueWith((s) => {
return
s;
});
使用IProgress实现异步编程的进程通知
private
void
btnSub_Click(
object
sender, RoutedEventArgs e)
{
Task task = Display();
}
void
DoProcessing(IProgress<
int
> progress)
{
if
(progress !=
null
)
{
progress.Report(1);
}
}
async Task Display()
{
//当前线程
var
progress =
new
Progress<
int
>(percent =>
{
this
.Title = percent.ToString();
});
//线程池线程
await Task.Run(() => DoProcessing(progress));
}