在前一篇中,了解了Task的基本用法
如果一個(gè)方法返回Task,Task<T>,如何獲取Task的返回值,獲取值的過程會(huì)阻塞線程嗎?
static void Main(string[] args){var result = DoWorkAsync().Result;Console.WriteLine(result);Console.WriteLine("我會(huì)什么時(shí)候顯示");Console.ReadKey();}static Task<string> DoWorkAsync(){return Task<string>.Factory.StartNew(() =>{Thread.Sleep(3000);return "hello";});}
可見,Task的Result屬性可以獲取返回值,而且,獲取返回值的過程線程是被阻塞的。
是否可以不阻塞線程,又能拿到某個(gè)線程的返回值呢?ContinueWith方法在某個(gè)線程結(jié)束之后進(jìn)行,但同時(shí)不會(huì)阻塞線程。
static void Main(string[] args){DoWorkAsync().ContinueWith((PRe) =>{Console.WriteLine(pre.Result);});Console.WriteLine("我會(huì)什么時(shí)候顯示");Console.ReadKey();}
但ContinueWith總會(huì)在某個(gè)線程結(jié)束之后進(jìn)行,是否可以對(duì)ContinueWith的過程控制一下呢?
static void Main(string[] args){DoWorkAsync().ContinueWith((pre) =>{Console.WriteLine(pre.Result);}, TaskContinuationOptions.NotOnFaulted);DoWorkAsync().ContinueWith((pre) =>{Console.WriteLine(pre.Exception);},TaskContinuationOptions.OnlyOnFaulted)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注