using System;
using System.Threading.Tasks;
namespace AsyncGenericDelegateEventExample
{
// 定义一个带有异步泛型委托的事件参数类
public class MyEventArgs<T> : EventArgs
{
public T Data { get; set; }
}
// 定义一个包含异步泛型委托事件的类
public class EventPublisher<T>
{
// 定义异步泛型委托
public delegate Task MyEventHandler(object sender, MyEventArgs<T> e);
// 声明异步泛型委托事件
public event MyEventHandler MyEvent;
// 引发事件的方法
public async Task OnMyEventAsync(T data)
{
// 创建事件参数
var args = new MyEventArgs<T> { Data = data };
// 异步调用所有订阅者的处理方法
if (MyEvent != null)
{
var subscribers = MyEvent.GetInvocationList();
foreach (var subscriber in subscribers)
{
var handler = (MyEventHandler)subscriber;
await handler.Invoke(this, args);
}
}
}
}
// 定义事件处理方法
public class EventSubscriber
{
// 事件处理方法
public async Task HandleMyEventAsync(object sender, MyEventArgs<string> e)
{
// 打印数据
Console.WriteLine($"Received data: {e.Data}");
// 模拟异步操作
await Task.Delay(2000);
// 打印完成消息
Console.WriteLine("Processing complete");
}
}
// 主程序入口
class Program
{
static async Task Main(string[] args)
{
// 创建事件发布者和订阅者
var publisher = new EventPublisher<string>();
var subscriber = new EventSubscriber();
// 订阅事件
publisher.MyEvent += subscriber.HandleMyEventAsync;
// 引发事件
await publisher.OnMyEventAsync("触发了事件");
// 等待一段时间,以便处理完成
await Task.Delay(3000);
// 取消订阅事件
publisher.MyEvent -= subscriber.HandleMyEventAsync;
}
}
}
首先定义了一个泛型的MyEventArgs<T>
类,其中包含一个Data
属性。然后,定义了一个泛型的EventPublisher<T>
类,包含一个异步泛型委托事件MyEvent
。在OnMyEventAsync
方法中,创建了一个MyEventArgs<T>
实例,并使用异步泛型委托调用所有订阅者的处理方法。然后,定义了一个EventSubscriber
类,其中包含一个处理事件的异步方法HandleMyEventAsync
。在主程序入口中,我们创建了事件发布者和订阅者的实例,并订阅了事件。然后,我们调用OnMyEventAsync
方法引发事件,并等待一段时间以确保处理完成。最后,取消订阅事件。