讓C#事件也可以異步觸發


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM