为了账号安全,请及时绑定邮箱和手机立即绑定

是否有一种通用方法来定义既不接收 Action 也不接收 Func<Task> 的方法?

是否有一种通用方法来定义既不接收 Action 也不接收 Func<Task> 的方法?

C#
潇潇雨雨 2023-09-09 16:37:04
我有一个方法,通过在另一个方法之前和之后运行一些逻辑来A包装另一个方法的执行。B该方法B可以是任务,也可以不是。因此,为了能够await在该方法B执行任务时,我必须实现两次该A方法,如下所示:public async Task A(int id, Action<int> b){    try    {        await BeforeAsync(id);        b(id);        await AfterAsync(id);    }    catch (Exception ex)    {        Handle(ex, id);    }}public async Task A(int id, Func<int,Task> b){    try    {        await BeforeAsync(id);        await b(id);        await AfterAsync(id);    }    catch (Exception ex)    {        Handle(ex, id);    }}有没有办法避免重复?
查看完整描述

3 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

事实并非如此,假设一些愚蠢的事情,比如传递一个对象并使用强制转换计数来测试它:)

那这个呢?

public Task A(int id, Action<int> b) => A(id, x => { b(a); return Task.CompletedTask; });

这样你就不会重复代码。


查看完整回答
反对 回复 2023-09-09
?
湖上湖

TA贡献2003条经验 获得超2个赞

使用 RX 观察者模式实现。


source.Subscribe(o => Log.Write($"On Next {o}"));

或者如果您指定其他前置条件和后置条件


source

  .Do(_ => Log.Write("Before"))

  .Finally(()=> Log.Write("After"))

  .Subscribe(

    o => Log.Write($"On Next {o}"),

    exception => Log.Write($"On Error {exception}")

    () => Log.Write("On Completed"));

问题在于


try

{

    await BeforeAsync(id);

    b(id);

    await AfterAsync(id);

}

是你会假设下面的 Catch 实际上会捕获所有异常,但事实并非如此,并且只有当你等待或等待它时才会发生。简而言之,正确地做到这一点要复杂得多。


查看完整回答
反对 回复 2023-09-09
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

就在这里:


public async Task A(int id, Delegate b)

{

    try

    {

        await BeforeAsync(id);

        if (b.DynamicInvoke(id) is Task task) await task;

        await AfterAsync(id);

    }

    catch (Exception ex)

    {

        Handle(ex, id);

    }

}

但现在你失去了类型安全(因为你可以通过任何委托)并且一无所获。


Task.Run有 8 个重载是有原因的: https ://referencesource.microsoft.com/#q=task.run


查看完整回答
反对 回复 2023-09-09
  • 3 回答
  • 0 关注
  • 78 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信