Task Parallel Library02,更进一步在前一篇中,了解了Task的基本用法
如果一个方法返回Task,Task<T>,如何获取Task的返回值,获取值的过程会阻塞线程吗?
static void Main(string[] args)
{
var result = DoWorkAsync().Result;
Console.WriteLine(result);
Console.WriteLine("我会什么时候显示");
Console.ReadKey();
}
static Task<string> DoWorkAsync()
{
return Task<string>.Factory.StartNew(() =>
{
Thread.Sleep(3000);
return "hello";
});
}
可见,Task的Result属性可以获取返回值,而且,获取返回值的过程线程是被阻塞的。
是否可以不阻塞线程,又能拿到某个线程的返回值呢?ContinueWith方法在某个线程结束之后进行,但同时不会阻塞线程。
static void Main(string[] args)
{
DoWorkAsync().ContinueWith((PRe) =>
{
Console.WriteLine(pre.Result);
});
Console.WriteLine("我会什么时候显示");
Console.ReadKey();
}
但ContinueWith总会在某个线程结束之后进行,是否可以对ContinueWith的过程控制一下呢?
static void Main(string[] args)
{
DoWorkAsync().ContinueWith((pre) =>
{
Console.WriteLine(pre.Result);
}, TaskContinuationOptions.NotOnFaulted);
DoWorkAsync().ContinueWith((pre) =>
{
Console.WriteLine(pre.Exception);
},TaskContinuationOptions.OnlyOnFaulted)