首页 > 代码库 > 浅析C# 异步编程的两种方式
浅析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个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。