如何创建返回Func<CancellationToken,Task>的通用HandleEvent函数?
问题:实现通用的事件处理包装函数
已知条件
已知obj1.Event接收Func<CancellationToken, Task>类型的委托,以下写法可正常工作:
obj1.Event += async _ => { try { await function1(stoppingToken); } catch (Exception ex) { Log.Error(ex.ToString()); } };
期望目标
希望创建通用的HandleEvent函数,实现更简洁的事件绑定形式:
obj1.Event += HandleEvent(() => function1(stoppingToken)); obj2.Event += HandleEvent(() => function2(stoppingToken)); obj3.Event += HandleEvent(() => function3(stoppingToken));
当前错误尝试
以下写法无法正常工作:
public Func<CancellationToken, Task> HandleEvent<T???>(Func<T> ????) { return func; }
正确实现方式
实现方案(适配闭包传递参数)
HandleEvent接收一个返回Task的工厂方法,内部封装原lambda中的异常捕获与异步等待逻辑,返回符合事件要求的委托类型:
public Func<CancellationToken, Task> HandleEvent(Func<Task> taskFactory) { return async _ => { try { await taskFactory(); } catch (Exception ex) { Log.Error(ex.ToString()); } }; }
使用方式与你期望的写法一致,通过闭包传递目标函数和stoppingToken参数即可完成事件绑定。
替代方案(显式传递参数)
如果希望参数传递更直观,也可以调整HandleEvent的参数定义:
public Func<CancellationToken, Task> HandleEvent(Func<CancellationToken, Task> handler, CancellationToken token) { return async _ => { try { await handler(token); } catch (Exception ex) { Log.Error(ex.ToString()); } }; }
使用时直接传入目标函数和令牌:
obj1.Event += HandleEvent(function1, stoppingToken); obj2.Event += HandleEvent(function2, stoppingToken); obj3.Event += HandleEvent(function3, stoppingToken);
内容的提问来源于stack exchange,提问作者chrisg229
相关产品推荐
相关产品推荐

