1. 程式人生 > >C# 基於任務的異步模式的創建與使用的簡單示例

C# 基於任務的異步模式的創建與使用的簡單示例

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# 基於任務的異步模式的創建與使用的簡單示例