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