You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 05:05:14