標籤:非同步 c#
一.傳統BeginInvoke方式.
BeginInvoke方法用於啟動c#非同步呼叫.它返回IasyncResult,可用於監視調用進度.EndInvoke方法用於檢索c#非同步呼叫結果.
調用BeginInvoke後可隨時調用EndInvoke方法;如果C#非同步呼叫未完成,EndInvoke將一直阻塞到C#非同步呼叫完成.
總結其使用大體分5個步驟:
1.聲明委拖
2.建立非同步方法呼叫
3.執行個體化委拖(把委拖與方法關聯) A
4.通過執行個體的BeginInvoke調用非同步方法呼叫
5.通過執行個體的EndInvoke結束非同步呼叫方法
執行個體:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace AsyncAndAwait{ public partial class Form2 : Form { public Form2() { InitializeComponent(); } //1.聲明一委託 public delegate void Ass(); //2.建立非同步方法呼叫 private void Event1() { Console.WriteLine("Event1 Start"); System.Threading.Thread.Sleep(4000); Console.WriteLine("Event1 End"); } private void button1_Click(object sender, EventArgs e) { //3.執行個體委拖(關聯方法) Ass MyAss = new Ass(Event1); //4.通過執行個體的BeginInvoke調用非同步方法呼叫 IAsyncResult ia = MyAss.BeginInvoke(null, null); //5.通過執行個體的EndInvoke結束非同步呼叫方法 MyAss.EndInvoke(ia); } }}
二.net 4.5引入了使用兩個新的關鍵字async和await非同步呼叫的方法
Async和Await關鍵字是C#非同步編程的核心。通過使用這兩個關鍵字,你可以使用.NET Framework
或Windows Runtime的資源建立一個非同步方法呼叫如同你建立一個同步的方法一樣容易。通過使用async和await
定義的非同步方法呼叫,這裡被稱為非同步方法呼叫。
下面的例子顯示了一個非同步方法呼叫。代碼中的幾乎所有的東西你看起來應該非常熟
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace AsyncAndAwait{ public partial class Form3 : Form { public Form3() { InitializeComponent(); } //聲明非同步方法呼叫 private async Task<int> Event1() { Console.WriteLine("Start"); await Task.Delay(4000); Console.WriteLine("End"); return 2; } private async void button1_Click(object sender, EventArgs e) { //調用非同步方法呼叫--方式1 int Back= await Event1(); MessageBox.Show(Back.ToString()); //調用非同步方法呼叫--方式2 Task<int> Back1 = Event1(); //// 你可以做一些不依賴於傳回值的操作. int Back2 = await Back1; MessageBox.Show(Back2.ToString()); } }}
上例在Event1方法中用到了await Task.Delay(100)這條語句,這是為了讓AsyncWork成為非同步方法呼叫才加的,
如果你要進行的操作不支援await修飾怎麼辦,其實很簡單,使用Task.Factory.StartNew()就行了,舉例:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace AsyncAndAwait{ public partial class Form4 : Form { public Form4() { InitializeComponent(); } //聲明非同步方法呼叫 //如果你要進行的操作不支援await修飾怎麼辦,其實很簡單,使用Task.Factory.StartNew()就行了,舉例: private async Task<int> Event1() { int inPut = 4000; Console.WriteLine("Event1 Start"); await Task.Factory.StartNew((Func<object, int>)Event2, inPut); Console.WriteLine("Event1 End"); return 2; } //同步方法,不支援await修飾,如果要非同步呼叫輸入參數只能是object類型,需要進行類型轉化 private int Event2(object input) { int val = (int)input; System.Threading.Thread.Sleep(val); return 2; } private async void button1_Click(object sender, EventArgs e) { ////調用非同步方法呼叫--方式1 //int Back = await Event1(); //MessageBox.Show(Back.ToString()); //調用非同步方法呼叫--方式2 Task<int> Back1 = Event1(); //// 你可以做一些不依賴於 傳回值的操作. int Back2 = await Back1; MessageBox.Show(Back2.ToString()); } }}