C# WPF实现异步发布事件,避免阻塞

WPF中直接使用Invoke发布事件时通常都是阻塞的,如果订阅事件的处理中含有耗时处理以及订阅事件过多时,会导致界面响应慢,用户体验不好,因此可以使用BeginInvoke来达到异步的方式。

如,自定义事件:

public delegate void TestConsoleMsgHandler(int test1, int test2, IntPtr test3);
public event TestConsoleMsgHandler TestConsoleEvent;

在需要发布事件的地方改为以下方式:

//获取事件中的多路委托列表
Delegate[] delegArray = TestConsoleEvent.GetInvocationList();
//遍历委托列表
foreach (TestConsoleMsgHandler item in delegArray)
{
	//异步调用委托
	item?.BeginInvoke(test1, test2, test3, null, null);
}

又比如自定义事件:

public event EventHandler TestEvent;

在需要发布事件的地方改为以下方式:

//获取事件中的多路委托列表
Delegate[] delegArray = TestEvent.GetInvocationList();
//遍历委托列表
foreach (EventHandler item in delegArray)
{
	//异步调用委托
	item?.BeginInvoke(this, testInfo, null, null);
}

一般来说,我们可以调用EndInvoke来获取事件发布后,订阅者返回的事件结果,但这里可以不调用,因为我们不关心订阅者接收到事件后的结果处理,我们只需要不阻塞的发布事件即可。

你可能感兴趣的:(C#,wpf)