Код, использующий ключевое слово 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
}
, но это, очевидно, кошмар для написания и поддержки - и этот надуманный пример имеет только 2 метода глубины.Возможно, я тоже мог бы что-то взломать с помощью Reflection, но я бы хотел этого избежать, по крайней мере для пути производственного (асинхронного) кода, чтобы сохранить производительность и безопасность типов.
Примечание: заголовок похож на Как переключаться между асинхронностью и синхронизацией в .NET / C # , но это не дубликат этого вопроса, который касается запуска одного набора методов синхронизации или асинхронности.Я ищу способ сделать это с помощью вызывающего метода и его вызывающих методов и т. Д.