在委托与事件(一)中,学习了委托和事件的使用,用的是委托的同步调用。有时候委托绑定的方法执行完成时间可能较长的任务,如打开大文件、连接远程计算机或查询数据库,这时为了提高效率通常使用异步调用。异步操作在主应用程序线程以外的线程中执行。应用程序调用方法异步执行某个操作时,应用程序可在异步方法执行其任务时继续执行。在之前的猫和老鼠例子中,修改cat类中的CatShout的调用方式,即可实现异步调用。
namespace PracticeCsharp
{
class Cat
{
private string name;
public Cat(string name)
{
this.name = name;
}
public delegate void CatShoutEventHandler();
public event CatShoutEventHandler CatShout;
public void Shout()
{
if(CatShout!= null)
{
//CatShout(); // 之前的同步调用
/*当event CatShout 在外部有多处绑定时(MutilDelegate),需要先使用event 对象的GetInvocationList()方法获取绑定方法的列表,再遍历列表,依次对绑定的方法进
行异步调用。如果只是event只是绑定一个方法,则可以直接使用BeginInvoke进行异步调用:CatShout.BeginInvoke(null, null)*/
var reveivers = CatShout.GetInvocationList();
foreach (CatShoutEventHandler reveiver in reveivers)
{
reveiver.BeginInvoke(null, null);
}
}
}
}
class Mouse
{
private string name;
public Mouse(string name)
{
this.name = name;
}
public void Run()
{
Thread.Sleep(1000);
Console.WriteLine("Cat is coming,{0} is hurry to run", name);
}
}
class DelegateTest
{
public static void Main()
{
Cat cat = new Cat("Tom");
Mouse mouse1 = new Mouse("Jerry");
Mouse mouse2 = new Mouse("Jack");
//event绑定多个方法。
cat.CatShout += mouse1.Run;
cat.CatShout += mouse2.Run;
cat.Shout();
Console.WriteLine("Mian thread has completed!");
Console.Read();
}
}
}