在前一篇中,了解了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)
新聞熱點
疑難解答