C# 基於任務的異步模式的創建與使用的簡單示例
阿新 • • 發佈:2018-09-30
color 方法名 ui控件 object 文字 lee dog name 分享圖片
對於窗體程序,使用基於任務的異步模式需要用到Task類,下面示例下非常簡單的用法。
1.創建一個擁有異步方法的類
該類擁有一個異步方法DoSomthingAsync,根據微軟建議的命名規則該方法要帶Async後綴
public class Dog { public Task DoSomthingAsync() { Task task = Task.Run(() => { Console.WriteLine("後臺任務開始運行"); Thread.Sleep(5000); Console.WriteLine("後臺任務運行結束"); }); return task; } }
當調用該方法的時候,就是異步執行的。為了在該方法執行完成後做進一步處理,需要寫一個任務完成後的程序來做點事情,比如更新UI控件。
2.創建任務完成後需要執行的方法
using System; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace TaskTest {public partial class Form1 : Form { public Form1() { InitializeComponent(); } /// ///任務完成後要執行的方法,更新UI /// private void OnDoSomthingIsComplete(Task t) { Action action = () => { textBox.Text = "任務完成後顯示這段文字到UI控件"; }; textBox.Invoke(action); } } }
對於上面定義的這個OnDoSonthingIsComplete方法,我采用了類似於事件方式的命名規則。
另外,這個方法也和使用BackgroundWorker類一樣,並不是在調用者線程上執行的,而是在異步線程中執行的。這就是為什麽需要使用textBox.Invoke方法。
3.調用該類的異步方法
在button按下的時候調用。這裏把上面所有的代碼都整合在一起了。
using System; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace TaskTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void OnDoSomthingIsComplete(Task t) { Action action = () => { textBox.Text = "任務完成後顯示這段文字到UI控件"; }; textBox.Invoke(action); } private void button1_Click(object sender, EventArgs e) { Dog dog = new Dog(); Task task = dog.DoSomthingAsync().ContinueWith(OnDoSomthingIsComplete); } } /// <summary> /// Dog類 /// </summary> public class Dog { public Task DoSomthingAsync() { Task task = Task.Run(() => { Console.WriteLine("後臺任務開始運行"); Thread.Sleep(5000); Console.WriteLine("後臺任務運行結束"); }); return task; } } }
執行效果如下:
最後再說明下,對於任務執行完成後要執行處理程序,可不不用顯式指定方法名,下面用lambda方式會更簡練:
private void button1_Click(object sender, EventArgs e) { Dog dog = new Dog(); Task task = dog.DoSomthingAsync().ContinueWith((Task t)=> { Action action = () => { textBox.Text = "任務完成後顯示這段文字到UI控件"; }; textBox.Invoke(action); }); }
C# 基於任務的異步模式的創建與使用的簡單示例