.NET 4 并行(多核)编程系列之五
2010-06-01 23:06
316 查看
.NET 并行(多核)编程系列之五 Task执行和异常处理
前言:本篇主要讲述等待task执行完成。
本篇的议题如下:
1. 等待Task执行完成
2. Task中的异常处理
首先注意一点:这里提到的"等待"和之前文章提到的"休眠"意思是不一样的:
等待:在等待一个task的时候,这个task还是在运行之中的,"等待"相当于在监听运行的task的执行情况。
休眠:让tasku不运行。
在上篇文章中介绍了如果从Task中获取执行后的结果:在Task执行完成之后调用Task.Result获取。其实也可以用其他的方法等待Task执行完成而不获取结果,这是很有用的:如果你想等待一个task完成之后再去做其他的事情。而且我们还可以等待一个task执行完成,或者等待所有的task执行完成,或者等待很多task中的一个执行完成。因为Task是由内部的Scheduler管理的,调用wait方法,其实就是我们在监控task的执行,看看这个task是否执行完了,如果完成,那么wanit方法就返回true,反之。
1. 等待Task执行完成
1.1等待单独的一个Task执行完成
我们可以用Wait()方法来一直等待一个Task执行完成。当task执行完成,或者被cancel,或者抛出异常,这个方法才会返回。可以使用Wait()方法的不同重载。举个例子:
代码
static void Main(string[] args)
{
// create the cancellation token source and the token
CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;
// create a task that waits on the cancellation token
Task task1 = new Task(() =>
{
// wait forever or until the token is cancelled
token.WaitHandle.WaitOne(-1);
// throw an exception to acknowledge the cancellation
throw new OperationCanceledException(token);
}, token);
// create a task that throws an exception
Task task2 = new Task(() =>
{
throw new NullReferenceException();
});
// start the tasks
task1.Start(); task2.Start();
// cancel the token
tokenSource.Cancel();
// wait on the tasks and catch any exceptions
try
{
Task.WaitAll(task1, task2);
}
catch (AggregateException ex)
{
// iterate through the inner exceptions using
// the handle method
ex.Handle((inner) =>
{
if (inner is OperationCanceledException)
{
// ...handle task cancellation...
return true;
}
else
{
// this is an exception we don't know how
// to handle, so return false
return false;
}
});
}
// wait for input before exiting
Console.WriteLine("Main method complete. Press enter to finish.");
Console.ReadLine();
}
今天就写到这里。谢谢!
版权为小洋和博客园所有,转载请标明出处给作者。
http://www.cnblogs.com/yanyangtian
前言:本篇主要讲述等待task执行完成。
本篇的议题如下:
1. 等待Task执行完成
2. Task中的异常处理
首先注意一点:这里提到的"等待"和之前文章提到的"休眠"意思是不一样的:
等待:在等待一个task的时候,这个task还是在运行之中的,"等待"相当于在监听运行的task的执行情况。
休眠:让tasku不运行。
在上篇文章中介绍了如果从Task中获取执行后的结果:在Task执行完成之后调用Task.Result获取。其实也可以用其他的方法等待Task执行完成而不获取结果,这是很有用的:如果你想等待一个task完成之后再去做其他的事情。而且我们还可以等待一个task执行完成,或者等待所有的task执行完成,或者等待很多task中的一个执行完成。因为Task是由内部的Scheduler管理的,调用wait方法,其实就是我们在监控task的执行,看看这个task是否执行完了,如果完成,那么wanit方法就返回true,反之。
1. 等待Task执行完成
1.1等待单独的一个Task执行完成
我们可以用Wait()方法来一直等待一个Task执行完成。当task执行完成,或者被cancel,或者抛出异常,这个方法才会返回。可以使用Wait()方法的不同重载。举个例子:
代码
static void Main(string[] args)
{
// create the cancellation token source and the token
CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;
// create a task that waits on the cancellation token
Task task1 = new Task(() =>
{
// wait forever or until the token is cancelled
token.WaitHandle.WaitOne(-1);
// throw an exception to acknowledge the cancellation
throw new OperationCanceledException(token);
}, token);
// create a task that throws an exception
Task task2 = new Task(() =>
{
throw new NullReferenceException();
});
// start the tasks
task1.Start(); task2.Start();
// cancel the token
tokenSource.Cancel();
// wait on the tasks and catch any exceptions
try
{
Task.WaitAll(task1, task2);
}
catch (AggregateException ex)
{
// iterate through the inner exceptions using
// the handle method
ex.Handle((inner) =>
{
if (inner is OperationCanceledException)
{
// ...handle task cancellation...
return true;
}
else
{
// this is an exception we don't know how
// to handle, so return false
return false;
}
});
}
// wait for input before exiting
Console.WriteLine("Main method complete. Press enter to finish.");
Console.ReadLine();
}
今天就写到这里。谢谢!
版权为小洋和博客园所有,转载请标明出处给作者。
http://www.cnblogs.com/yanyangtian
相关文章推荐
- .NET 并行(多核)编程系列之六 Task基础部分完结篇
- .NET 并行(多核)编程系列之五 Task执行和异常处理
- .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
- .NET 4 并行(多核)编程系列之三 从Task的取消
- .NET 4 并行(多核)编程系列之六
- .NET 4 并行(多核)编程系列之一入门介绍
- 一起谈.NET技术,.NET 4 并行(多核)编程系列之一入门介绍
- .NET 4 并行(多核)编程系列之一入门介绍
- .NET 4 并行(多核)编程系列之一入门介绍
- .NET 4 并行(多核)编程系列之三
- .NET 并行(多核)编程系列之七 共享数据问题和解决概述
- .NET 4 并行(多核)编程系列之一入门介绍
- .NET 4 并行(多核)编程系列之二 从Task开始
- .NET“.NET研究” 4 并行(多核)编程系列之一入门介绍
- .NET 4 并行(多核)编程系列
- .NET 并行(多核)编程系列之七 共享数据问题和解决概述
- .NET 4 并行(多核)编程系列之三 从Task的取消
- .NET 4 并行(多核)编程系列之三
- .NET 4 并行(多核)编程系列之一
- .NET 并行(多核)编程系列之七 共享数据问题和解决概述