我想编写一个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;
}
虽然我可以让我的异步方法返回 void
而不是 Task
,但我对这样做感到非常不舒服。
那么,是否有一个类似于 ConditionalAttribute
的东西可用于想要返回值的方法?或者至少对于那些只想返回一个 Task
的方法是否有一个?