淺析C# 非同步編程的兩種方式

來源:互聯網
上載者:User

標籤:非同步   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());        }    }}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.