一.传统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());
-
- }
- }
- }
|