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<TestInfo> TestEvent;
在需要发布事件的地方改为以下方式:
//获取事件中的多路委托列表
Delegate[] delegArray = TestEvent.GetInvocationList();
//遍历委托列表
foreach (EventHandler<TestInfo> item in delegArray)
{
//异步调用委托
item?.BeginInvoke(this, testInfo, null, null);
}
一般来说,我们可以调用EndInvoke来获取事件发布后,订阅者返回的事件结果,但这里可以不调用,因为我们不关心订阅者接收到事件后的结果处理,我们只需要不阻塞的发布事件即可。