C#異步編程のTask模型返回值Task 應用


文中所有Task<TResult>的返回值都是直接用task.result獲取,這樣如果后台任務沒有執行完畢的話,主線程會等待其執行完畢,這樣的話就和同步一樣了(看上去一樣,但其實await的時候並不會造成線程的阻塞,web程序感覺不到,但是wpf,winform這樣的桌面程序若不使用異步,會造成UI線程的阻塞)。簡單演示一下Task回調函數的使用:

Console.WriteLine("主線程開始");
Task<string> task = Task<string>.Run(() => {
    Thread.Sleep(2000); 
    return Thread.CurrentThread.ManagedThreadId.ToString(); 
});
//會等到任務執行完之后執行
task.GetAwaiter().OnCompleted(() =>
{
    Console.WriteLine(task.Result);
});
Console.WriteLine("主線程結束");
Console.Read();

 結果:

OnCompleted中的代碼會在任務執行完成之后執行!

另外task.ContinueWith()也是一個重要的方法:

Console.WriteLine("主線程開始");
Task<string> task = Task<string>.Run(() => {
    Thread.Sleep(2000); 
    return Thread.CurrentThread.ManagedThreadId.ToString(); 
});

task.GetAwaiter().OnCompleted(() =>
{
    Console.WriteLine(task.Result);
});
task.ContinueWith(m=>{Console.WriteLine("第一個任務結束啦!我是第二個任務");});
Console.WriteLine("主線程結束");
Console.Read();  

 

結果:

ContinueWith()方法可以讓該后台線程繼續執行新的任務。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM