繁体   English   中英

标记仅使用条件属性返回任务的异步方法?

[英]Mark async methods that just return a Task with the Conditional attribute?

System.Diagnostics.ConditionalAttribute对于分割调试代码片段非常有用,无需使用编译器指令,但它只与返回void方法兼容。
有没有办法为返回Task异步方法使用它(或等效的东西)?

没有。

可以毫无问题地移除void方法,因为无论是否存在方法调用,评估堆栈的净效果都是相同的:零。

无法删除非void方法,因为在删除它的情况下,堆栈上没有任何东西,并且在没有删除它的情况下,堆栈上有一件事:对任务的引用。

换句话说:你期望这样做:

Foo(BarAsync());

如果Foo接受Task并且删除了BarAsync

有没有办法为返回Task异步方法使用它(或等效的东西)?

与任何值返回函数相同:将调用包装在一个返回void的helper方法中,通过ref参数“返回”该值。 是的,这很笨拙,但是这样你就不得不为return参数写一个初始化器,而初始化器就是如果它被删除的话它是如何有效的:你永远不会得到未初始化的值。

[Conditional("DEBUG")]
public void FooAsync(ref Task task) {
    Func<Task> impl = async () => {
        // ...
    };
    task = impl();
}

用法:

public async Task CallFoo() {
    var task = Task.CompletedTask;
    FooAsync(ref task);
    await task;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM