什麼是非同步 舉個例子:小明的媽媽讓小明燒一壺水,水燒開後要倒進水壺裡,同時還需要把家裡打掃一下. 小明的操作流程一:燒水 >等待至水燒開 >水倒進水壺裡 >打掃家務 小明的操作流程二:燒水 >打掃家務 >等水燒開了就將水倒進水壺裡 >繼續打掃家務. 第二種方式就是非同步. 非同步的使用 一.以委托方式調 ...
什麼是非同步
舉個例子:小明的媽媽讓小明燒一壺水,水燒開後要倒進水壺裡,同時還需要把家裡打掃一下.
小明的操作流程一:燒水---->等待至水燒開----->水倒進水壺裡-------->打掃家務
小明的操作流程二:燒水----->打掃家務-------->等水燒開了就將水倒進水壺裡-------->繼續打掃家務.
第二種方式就是非同步.
非同步的使用
一.以委托方式調用非同步
delegate void Write(); static void Main(string[] args) { Console.WriteLine("我是主線程"); Write write = new Write(new Program().WriteLine); write.BeginInvoke(new Program().Judge, null); Console.WriteLine("我還是是主線程"); Console.Read(); } private void WriteLine() { Console.WriteLine("開始計算1+1"); Thread.Sleep(3000); Console.WriteLine("結果是3!"); } private void Judge(IAsyncResult async) { Console.WriteLine("計算錯誤!"); }
運行結果 ;其中WriteLine()是需要非同步執行的方法,Judge()是非同步執行完之後調用的方法,如果沒有回調,則在執行委托時 將 new Program().Judge 改成null就行了.
二. async、await
非同步方法需要用async關鍵字標記,但async標記的方法不一定是非同步方法.
static void Main(string[] args) { Console.WriteLine("我是主線程1"); Task task =new Program(). Write1(); Console.WriteLine("我是主線程2"); Console.Read(); } private async Task Write1() { int po = Thread.CurrentThread.ManagedThreadId; Console.WriteLine(po); Console.WriteLine("First async Run End"); }
運行結果, ,可以看到Write1()依然是在主線程中執行的.
await的使用限制:必須在有async標記的方法中使用.後面接的方法的返回值類型必須是Task或Task<T>..
static void Main(string[] args) { Console.WriteLine("我是主線程1"); Task task =new Program(). Write1(); Console.WriteLine("我是主線程2"); Console.Read(); } private async Task Write1() { await Write2(); int po = Thread.CurrentThread.ManagedThreadId; Console.WriteLine(po); Console.WriteLine("First async Run End"); } private async Task Write2() { Console.WriteLine("Hello World!"); await Write3(); for (int i = 0; i < 3; i++) { int po = Thread.CurrentThread.ManagedThreadId; Console.WriteLine(po); Console.WriteLine("Working..{0}", i); await Task.Delay(1000); //和Thread.Sleep(1000)效果一樣. } } private async Task Write3() { for (int i = 0; i < 3; i++) { int po = Thread.CurrentThread.ManagedThreadId; Console.WriteLine(po); Console.WriteLine("wirte3"); await Task.Delay(1000); } }
運行結果
await表示的是await XX()之後的方法時非同步的, XX()方法依然是在主線程中執行的,所以Write2()中的
Console.WriteLine("Hello World!")是在主線程中完成的,Write3()的第一次迴圈也是在主線程中完成的,然後第一次結束後有一個
await Task.Delay(1000);所以第二次迴圈是在非同步線程中完成的.