讓C#事件也可以非同步觸發
轉自: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();
}
}
}
相關文章
- C#中allowdrop設定為true也不能讓dragdrop事件觸發解決辦法C#事件
- 讓Vue也可以使用ReduxVueRedux
- 取消事件觸發事件
- C#不可在類外觸發類裡面的靜態事件C#事件
- 填報表中也可以新增 html 事件HTML事件
- 使用純c#在本地部署多模態模型,讓本地模型也可以理解影像C#模型
- oracle 觸發器-表同步Oracle觸發器
- 使用 jQuery 觸發 Vue 事件jQueryVue事件
- 取消事件觸發(妙啊)事件
- jQuery select 觸發事件jQuery事件
- JavaScript 模擬事件觸發JavaScript事件
- 有趣的觸發器事件觸發器事件
- oracle 觸發器 client 事件Oracle觸發器client事件
- Oracle觸發器6(建立系統事件觸發器)Oracle觸發器事件
- Android觸控事件(下)——事件的分發Android事件
- js 建立和觸發事件 和 自定義事件JS事件
- 如何觸發react input change事件React事件
- WebSocket的事件觸發機制Web事件
- Yii中事件觸發機制事件
- mvvm模式 事件觸發器[wpf]MVVM模式事件觸發器
- Vue事件獲取觸發事件物件和繫結事件物件Vue事件物件
- epoll 非阻塞IO 邊沿觸發模式模式
- touch事件和click事件多次觸發的問題事件
- javascript避免dom事件重複觸發JavaScript事件
- js頁面載入觸發事件JS事件
- view.performClick()觸發點選事件ViewORM事件
- 雙擊事件(dblclick)時,不觸發單擊事件(click)事件
- C#執行緒同步自動重置事件——AutoResetEventC#執行緒事件
- C#執行緒同步手動重置事件——ManualResetEventC#執行緒事件
- 通過程式碼控制View的觸控事件被觸發View事件
- 觸控事件事件
- Android 讓你的SeekBar 也支援長按事件薦Android事件
- 羨慕 C# 的 switch 表示式不,JS 也可以有C#JS
- 【透鏡系列】看穿 > 觸控事件分發 >事件
- withoutEvents函式裡面的事件被觸發函式事件
- javascript如何獲取觸發事件的物件JavaScript事件物件
- 第77天:jQuery事件繫結觸發jQuery事件
- js程式碼觸發事件 函式列表JS事件函式