使用async
关键字的代码对于提高性能非常有用,但是使用它的任何人都知道:
1)几乎不可能进行调试;和
2)它倾向于在整个代码库中“增长”,一直到主要方法为止
通常,一个方法的同步和异步版本仅通过调用另一个方法的同步和异步版本而有所不同。
有没有一种方法可以在整个调用堆栈中轻松地在代码的异步和同步版本之间进行切换(即,从Main到调用某些库方法的所有方法)?
我当然可以做这样的事情:
public static
#if NOASYNC
void
#else
async Task
#endif
Main(string[] args)
{
string fileName = Console.ReadLine();
#if NOASYNC
string contents = MyMethod1(fileName);
#else
string contents = await MyMethod1(fileName);
#endif
Console.WriteLine(contents);
}
private static
#if NOASYNC
string
#else
async Task<string>
#endif
MyMethod1(string fileName)
{
var reader = new StreamReader(fileName);
#if NOASYNC
return reader.ReadToEnd();
#else
return await reader.ReadToEndAsync();
#endif
}
但这显然是编写和维护的噩梦-这个人为的例子只有两种方法。我可能也可以使用Reflection来破解某些东西,但至少在生产(异步)代码路径中,为了保持性能和类型安全,我想避免这种情况。
注意:标题类似于How to switch between async & sync in .NET/C#,但这不是该问题的重复,该问题与运行同步或异步一组方法有关。我正在寻找一种使用调用方法及其调用方法等的方法。