點擊按鈕,異步實行,實現界面的無阻塞狀態。
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); } } } }