分享

浅析C# 异步编程的两种方式

 peter0732 2014-06-26

一.传统BeginInvoke方式.

    BeginInvoke方法用于启动c#异步调用.它返回IasyncResult,可用于监视调用进度.EndInvoke方法用于检索c#异步调用结果.

调用BeginInvoke后可随时调用EndInvoke方法;如果C#异步调用未完成,EndInvoke将一直阻塞到C#异步调用完成.   

总结其使用大体分5个步骤:

1.声明委拖

2.创建异步方法

3.实例化委拖(把委拖与方法关联)  A

4.通过实例的BeginInvoke调用异步方法

5.通过实例的EndInvoke结束异步调用方法

实例:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Threading.Tasks;  
  9. using System.Windows.Forms;  
  10.   
  11. namespace AsyncAndAwait  
  12. {  
  13.     public partial class Form2 : Form  
  14.     {  
  15.         public Form2()  
  16.         {  
  17.             InitializeComponent();  
  18.         }  
  19.         //1.声明一委托  
  20.         public delegate void Ass();  
  21.   
  22.         //2.创建异步方法  
  23.         private void Event1()  
  24.         {  
  25.             Console.WriteLine("Event1 Start");  
  26.             System.Threading.Thread.Sleep(4000);  
  27.             Console.WriteLine("Event1 End");  
  28.         }  
  29.   
  30.          private void button1_Click(object sender, EventArgs e)  
  31.          {  
  32.              //3.实例委拖(关联方法)  
  33.              Ass MyAss = new Ass(Event1);  
  34.              //4.通过实例的BeginInvoke调用异步方法  
  35.              IAsyncResult ia = MyAss.BeginInvoke(null, null);  
  36.              //5.通过实例的EndInvoke结束异步调用方法  
  37.              MyAss.EndInvoke(ia);  
  38.   
  39.          }  
  40.     }  
  41. }  

二.net 4.5引入了使用两个新的关键字async和await异步调用的方法

Async和Await关键字是C#异步编程的核心。通过使用这两个关键字,你可以使用.NET Framework

或Windows Runtime的资源创建一个异步方法如同你创建一个同步的方法一样容易。通过使用async和await

定义的异步方法,这里被称为异步方法。

下面的例子显示了一个异步方法。代码中的几乎所有的东西你看起来应该非常熟

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Threading.Tasks;  
  9. using System.Windows.Forms;  
  10.   
  11. namespace AsyncAndAwait  
  12. {  
  13.     public partial class Form3 : Form  
  14.     {  
  15.         public Form3()  
  16.         {  
  17.             InitializeComponent();  
  18.         }  
  19.         //声明异步方法  
  20.         private async Task<int>  Event1()  
  21.         {  
  22.             Console.WriteLine("Start");  
  23.             await Task.Delay(4000);  
  24.             Console.WriteLine("End");  
  25.             return 2;  
  26.           
  27.         }  
  28.   
  29.   
  30.          
  31.         private async void button1_Click(object sender, EventArgs e)  
  32.         {  
  33.             //调用异步方法--方式1  
  34.             int Back= await Event1();  
  35.             MessageBox.Show(Back.ToString());  
  36.             //调用异步方法--方式2  
  37.             Task<int> Back1 = Event1();  
  38.             //// 你可以做一些不依赖于返回值的操作.  
  39.             int Back2 = await Back1;  
  40.             MessageBox.Show(Back2.ToString());  
  41.         }  
  42.     }  
  43. }  

上例在Event1方法中用到了await Task.Delay(100)这条语句,这是为了让AsyncWork成为异步方法才加的,

如果你要进行的操作不支持await修饰怎么办,其实很简单,使用Task.Factory.StartNew()就行了,举例: 

   

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Threading.Tasks;  
  9. using System.Windows.Forms;  
  10.   
  11. namespace AsyncAndAwait  
  12. {  
  13.     public partial class Form4 : Form  
  14.     {  
  15.         public Form4()  
  16.         {  
  17.             InitializeComponent();  
  18.         }  
  19.   
  20.         //声明异步方法  
  21.         //如果你要进行的操作不支持await修饰怎么办,其实很简单,使用Task.Factory.StartNew()就行了,举例:  
  22.         private async Task<int> Event1()  
  23.         {  
  24.             int inPut = 4000;  
  25.             Console.WriteLine("Event1 Start");  
  26.             await Task.Factory.StartNew((Func<object, int>)Event2, inPut);  
  27.             Console.WriteLine("Event1 End");  
  28.             return 2;  
  29.         }  
  30.   
  31.         //同步方法,不支持await修饰,如果要异步调用输入参数只能是object类型,需要进行类型转化  
  32.         private int Event2(object input)  
  33.         {  
  34.             int val = (int)input;  
  35.   
  36.             System.Threading.Thread.Sleep(val);  
  37.             return 2;  
  38.         }  
  39.   
  40.         private async void button1_Click(object sender, EventArgs e)  
  41.         {  
  42.             ////调用异步方法--方式1  
  43.             //int Back = await Event1();  
  44.             //MessageBox.Show(Back.ToString());  
  45.             //调用异步方法--方式2  
  46.             Task<int> Back1 = Event1();  
  47.             //// 你可以做一些不依赖于  返回值的操作.  
  48.             int Back2 = await Back1;  
  49.             MessageBox.Show(Back2.ToString());  
  50.   
  51.         }  
  52.     }  
  53. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多