先用一个实例来说明一下异步。通俗地讲,异步就是在同一个时间段里可以做多件事情,比如同一时间做饭(Cooking)、烧水(Boiling)、洗衣服(Washing)。方法BeginInvoke()新开一个线程进行异步调用;EndInvoke()阻塞执行一直到方法完成取得返回值。
实例1:做饭(8s)-烧水(5s)-洗衣服(3s),每开始和结束一件事情就报告一下
方法:利用函数代理的BeginInvoke()异步执行该代理所指向的方法。如:
cook.BeginInvoke(null, null);
boil.BeginInvoke(null, null);
wash.BeginInvoke(null, null);
Code:
namespace AsyncApp
{
public delegate void work();
public delegate void write(string s);
/// <summary>
/// test1:做饭(8s)-烧水(5s)-洗衣服(3s),每开始和结束一件事情就报告一下
/// </summary>
public partial class frmAsync : Form
{
private work wash;
private work boil;
private work cook;
private write writeIntoRTB;
public frmAsync()
{
InitializeComponent();
wash = new work(washing);
boil = new work(boiling);
cook = new work(cooking);
rtb.Text = "";
}
//btOK
private void btOK_Click(object sender, EventArgs e)
{
Run();
}
private void Run()
{
IAsyncResult iarCook = cook.BeginInvoke(null, null);
IAsyncResult iarBoil = boil.BeginInvoke(null, null);
IAsyncResult iarWash = wash.BeginInvoke(null, null);
//wash.EndInvoke(iarWash);
//boil.EndInvoke(iarBoil);
//cook.EndInvoke(iarCook);
}
private void washing()
{
string strWashStart = string.Format("I start washing at {0}.", System.DateTime.Now);
Console.WriteLine(strWashStart);
RefreshRTB(strWashStart);
System.Threading.Thread.Sleep(3000);
string strWashEnd = string.Format("I finish washing at {0}.", System.DateTime