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);
            }

        }
    }
}