讓C#事件也可以非同步觸發

pamxy發表於2013-09-12

轉自:http://www.blue1000.com/bkhtml/2012-07/70925.htm

在做專案時,通過事件機制來觸發一些動作。本能的過分相信系統事件機制的併發處理能力,結果發現程式在事件擁堵的時候會假死。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();
        }
    }
}

相關文章