Простое переключение между асинхронностью и синхронизацией по всему стеку вызовов (для отладки) - PullRequest
0 голосов
/ 08 июля 2019

Код, использующий ключевое слово 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 # , но это не дубликат этого вопроса, который касается запуска одного набора методов синхронизации или асинхронности.Я ищу способ сделать это с помощью вызывающего метода и его вызывающих методов и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...