在做項目時,通過事件機制來觸發一些動作。本能的過分相信系統事件機制的並發處理能力,結果發現程序在事件擁堵的時候會假死。google了下,發現事件也可以異步,整理如下:
如何實現異步事件調用呢?事件其實是一種MulticastDelegate(多播委托)。而MulticastDelegate類提供了一個GetInvocationList方法,該方法返回此多播委托的委托調用數組。利用該方法就能實現我們的異步事件調用功能。
代碼:
using System;
using System.Threading;
using System.Runtime.Remoting.Messaging;
namespace ProcessTest
{
class Program
{
//定義一個事件
public static event EventHandler<EventArgs> OnEvent;
//方法1
static void Method1(object sender, EventArgs e)
{
//顯示執行該方法的線程ID
Console.WriteLine("調用Method1的線程ID為:{0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000);
}
//方法2
static void Method2(object sender, EventArgs e)
{
Console.WriteLine("調用Method2的線程ID為:{0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000);
}
static void Main(string[] args)
{
//顯示主線程ID
System.Console.WriteLine("主線程ID為:{0}", Thread.CurrentThread.ManagedThreadId);
//將Method1和Method2注冊到事件中
OnEvent += new EventHandler<EventArgs>(Method1);
OnEvent += new EventHandler<EventArgs>(Method2);
//下面的代碼實現事件的異步調用
//獲取事件中的多路委托列表
Delegate[] delegAry = OnEvent.GetInvocationList();
//遍歷委托列表
foreach (EventHandler<EventArgs> deleg in delegAry)
{
//異步調用委托
deleg.BeginInvoke(null, EventArgs.Empty, null, null);
}
System.Console.ReadKey();
}
}
}