微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

禁止将“异步”委托作为方法参数传递

如何解决禁止将“异步”委托作为方法参数传递

假设我有一个这样的方法,它将 Action 作为参数:

public void runAction(Action theAction)
{
    theAction();
}

如何确保“异步”委托无法传递给方法?换句话说,我想禁止以下内容

public void doStuff()
{
    runAction(async delegate ()
    {
        await doAsyncStuff();
    });
}

我想禁止将“async”委托传递给同步“runAction”方法的原因是为了防止发生无声的错误。例如,如果'runAction'有两个版本(同步和异步),并且用户不小心将异步委托传递给同步一个,编译器和程序都会抛出错误,但可能会出现意想不到的后果。>

解决方法

如何确保无法将 async 委托传递给该方法?

不能,因为匿名异步函数可以转换为 void 委托。

然而,您可以做的是引入一个接受 Func<Task> 的重载,如果传递了 async 委托,它将被解决。

这将允许您以不同的方式处理异步委托:

public void RunAction(Action theAction)
{
    theAction();
}

public void RunAction(Func<Task> theAction)
{
    // do something different with an async delegate..
}

虽然这不会阻止编译时错误,但您可以抛出异常或记录该方法使用不正确的事实,而不是让它静默错误。

,

Timothy Stepanski 的链接评论帮助我进行了检查,如果检测到委托是异步的,则会抛出异常:

Check if Action is async lambda

public void runAction(Action theAction)
{
    var IsAsync = theAction.Method.IsDefined(typeof(AsyncStateMachineAttribute));
    theAction = IsAsync ? throw new Exception("async delegates are not allowed") : theAction;
    theAction();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。