点击按钮,异步实行,实现界面的无阻塞状态。
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); } } } }