在前一篇中,了解了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)
新闻热点
疑难解答