gpt4 book ai didi

c# - Task 返回异步方法的 ConditionalAttribute 的等价物

转载 作者:行者123 更新时间:2023-12-04 03:12:27 28 4
gpt4 key购买 nike

我想编写一个 async 方法,但我希望它仅在使用特定编译常量编译程序集时才可调用。

单向

我可以做到这一点的一种方法是使用 pragma 指令,即像这样的条件编译常量:

// Callee
#if FOO
public async Task DoFooAsync()
{
...
}
#end if

// Caller 1
#if Foo
// fire and forget
DoFooAsync();
#endif

// Caller 2
#if Foo
public async Task<T> DoWork<T>()
{
T returnValue = default(T);

// fire but don't forget
var fooTask = DoFooAsync();

// Prepare return value
returnValue = ...;

// Not terribly important but what if the caller wants
// to find out
if (fooTask.Status == Faulted)
{
// do something about it
}
}
#endif

如您所见,编写所有这些内容变得相当困惑。

另一种方式

另一种方法是使用 ConditionalAttribute .但是,从阅读文档来看,该属性似乎仅适用于返回 void 的方法。

如果没有那个约束,我会像这样轻松地使用该属性,这会使代码更整洁、更易于查看和阅读:

// Callee
[Conditional("FOO")]
public Task DoFooAsync() { ... }

// Caller
public async Task<T> DoWork<T>()
{
// fire and forget
DoFooAsync();

// fire but would like to know what happened
var fooTask = DoFooAsync();

T t = GetTee();

if (fooTask.IsFaulted) { ... }

return t;

}

虽然我可以让我的 async 方法返回 void 而不是 Task,但这样做我会感到非常不舒服。

那么,对于想要返回值的方法,是否有等效于 ConditionalAttribute 的方法?对于那些只想返回 Task 的方法,至少有一个吗?

最佳答案

如果根据您的条件编译它,您期望发生什么?它应该返回null吗?还是完成的任务?还是失败的任务?

可能的解决方案是像这样编写异步方法:

#if FOO
public Task DoFooAsync() => Task.FromResult(0);
#else
public Task DoFooAsync()
{
//...
}
#endif

因此,如果您使用条件符号编译程序集,您的调用者将获得空任务。

关于c# - Task 返回异步方法的 ConditionalAttribute 的等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43974969/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com