標籤:任務 src png 編程 輸出 component return loaded img
Task是.NET4.5加入的,跟線程池ThreadPool的功能類似,用Task開啟新任務時,會從線程池中調用線程,而Thread每次執行個體化都會建立一個新的線程。
長耗時操作是不是常用 await Task.Run( )?
看下面代碼:
namespace WpfApplication6{ /// <summary> /// MainWindow.xaml 的互動邏輯 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); ConsoleManager.Show();//開啟控制台視窗 } private void Window_Loaded(object sender, RoutedEventArgs e) { Console.WriteLine("主線程啟動"); Task task = Task.Run(() => { Thread.Sleep(1500); Console.WriteLine("task啟動"); }); Thread.Sleep(300); task.Wait(); Console.WriteLine("主線程結束"); } }}
結果:
分析:
開啟新任務的方法:Task.Run()或者Task.Factory.StartNew(),開啟的是後台線程
要在主線程中等待後台線程執行完畢,可以使用Wait方法(會以同步的方式來執行)。不用Wait則會以非同步方式來執行。
thread和Task的區別,thread new多少個就會建立多少個線程,而task是利用線程池中的線程。
task<TResult>就是有傳回值的Task,TResult就是傳回值類型。樣本:
private void Window_Loaded(object sender, RoutedEventArgs e) { Console.WriteLine("主線程開始"); //傳回值類型為string Task<string> task = Task<string>.Run(() => { Thread.Sleep(2000); return Thread.CurrentThread.ManagedThreadId.ToString(); }); //會等到task執行完畢才會輸出; Console.WriteLine(task.Result); Console.WriteLine("主線程結束"); }
通過task.Result可以取到傳回值,若取值的時候,後台線程還沒執行完,則會等待其執行完畢!
簡單提一下:
Task任務可以通過CancellationTokenSource類來取消。
C#多線程編程のTask(任務)