C # Async Await и общий асинхронный вопрос - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь понять кое-что об асинхронном программировании в целом.В C # кажется, что все теперь используют асинхронный ожидающий синтетический сахар для асинхронных операций, связанных с вводом-выводом.

Мой вопрос: любая ли операция, связанная с вводом-выводом, например чтение файла, запрос http и т. Д., Была синхронизирована дотеперь может стать asnync, написав функцию-обертку async?

Или так как лежащая в основе "старая" реализация, если она синхронизирована, не поможет вообще?выйдет ли поток, который раньше ждал до сих пор, или нет?

Кто-нибудь?

Ответы [ 2 ]

3 голосов
/ 27 мая 2019

Обертывание метода, sync, методом async может иметь некоторые преимущества.Базовый метод по-прежнему будет синхронным, но вы можете перенести этот метод в другой поток, так что поток, который ожидал, теперь может продолжить свое выполнение.Таким образом, в вашем примере, если поток пользовательского интерфейса вызывает метод блокировки GetHTTPResource, вы можете добиться отклика пользовательского интерфейса, перенеся этот метод в другой поток с помощью асинхронной оболочки.Я рекомендую вам это сообщение в блоге , которое, я думаю, поможет вам лучше понять, что подразумевает async сверх sync.( этот другой охватывает sync более async).

Если async более sync, поток все равно будет заблокирован.По этой причине в веб-приложении нет особого смысла, поэтому использование асинхронных упаковщиков для синхронных функций не имеет преимуществ в производительности.Цитирую вышеупомянутую статью (выделено мое):

Возможность асинхронного вызова синхронного метода ничего не делает для масштабируемости, потому что вы обычно все еще потребляете столько же ресурсов выЕсли бы вы вызывали его синхронно (на самом деле вы используете немного больше, поскольку при планировании чего-либо возникают накладные расходы), вы просто используете разные ресурсы для этого , например потокиз пула потоков вместо конкретного потока, в котором вы выполнялись.Преимущества масштабируемости, заявленные для асинхронных реализаций, достигаются за счет уменьшения количества ресурсов, которые вы используете, и это необходимо интегрировать в реализацию асинхронного метода ... это не то, что достигается путем обтекания.

Например, в случае ASP.NET-приложения полностью async код позволяет потокам обрабатывать новые запросы, в то время как другие запросы ожидают завершения операций ввода-вывода, что обеспечивает более высокую масштабируемость.С другой стороны, если код имеет базовые синхронные методы для операций ввода-вывода, будут блокироваться потоки, которые не смогут ничего делать, кроме как ждать завершения этих операций.Так что async более sync обычно не дает никаких преимуществ в случае веб-приложений.

0 голосов
/ 27 мая 2019

Да, ваша функция синхронизации может стать асинхронной, например, в HTTP-запросе вы можете изменить свою функцию синхронизации

public static Task<HttpResponseMessage> GetRequest(string requestUri, Dictionary<string, string> requestHeaders)
    {
        return HttpRequestFactory.Get(requestUri, requestHeaders);
    }

Функция вызова

var result =  HttpClient.GetRequest(requestUri, _request, _requestHeaders)

вы измените это на асинхронное, как это

public static async Task<HttpResponseMessage> GetRequest(string requestUri, Dictionary<string, string> requestHeaders)
   {
            return await HttpRequestFactory.Get(requestUri, requestHeaders);
   }

вызов функции на

var result = HttpClient.GetRequest(requestUri, _request, _requestHeaders).Result;

Надеюсь, это поможет вам ..

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