C#使用await異步調用按鈕事件處理函數

點擊按鈕,異步實行,實現界面的無阻塞狀態。
C#中推薦的異步開發模式,使用async來提示可能有異步操作,使用await 關鍵字 等待Task,來等待異步操作。
對於.net庫中提供的帶有Async後綴的方法,都可以使用await 方法來異步等待執行,方便開發過程。
如果想要使自己原先的同步方法編程異步方法,可以參考如下示例的paint方法。
該paint方法負責繪製文本框的邊框顏色爲藍色。
paintAsync()方法對paint進行了包裝,將其適配爲可以異步訪問的Task任務。
在button1_Click方法中,執行await paintAsync()就實現了異步調用按鈕事件

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            try
            {
                Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString() + "__1\r\n");
                //await Task.Run(new Action(paint));
                await paintAsync();    //await後面的方法必須是task類型的
                IOTest();  //await StreamWrite.WirteAsync方法來實現異步寫入。
                await NoneTest();   //使用new Task的方式創建任務,使用異步Start啓動,等價於Task.Run
                textBox1.Text += "await 結束";
                Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString() + "__2\r\n");

            }
            finally
            {

            }
        }

        public Task paintAsync()
        {

            return Task.Run(new Action(paint));
        }

        public async void IOTest()
        {
            StreamWriter sw = new StreamWriter("./streamIO.txt");

            await sw.WriteAsync("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + Thread.CurrentThread.ManagedThreadId.ToString());   //此處線程號爲主界面線程
            sw.Flush();
            sw.Close();
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString() + "__4\r\n");

        }
        public Task NoneTest()
        {
            Task t1 = new Task(() => { Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString() + "__5\r\n"); });   //線程號爲後臺線程號
            t1.Start();
            return t1;
        }

        public void  paint()
        {
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString() + "__3\r\n") ; //線程號爲後臺線程號
            using (Graphics g = this.CreateGraphics())
            {
                Rectangle rect = new Rectangle(textBox1.Location.X - 1, textBox1.Location.Y - 1, textBox1.Width, textBox1.Height);
                using (Pen pen = new Pen(Color.Blue))
                {
                    g.DrawRectangle(pen, rect);
                }
                rect.Inflate(-1, -1);
                g.DrawRectangle(new Pen(Color.Pink), rect);
            }

        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章