.Net Core Async Await - не работает должным образом - PullRequest
0 голосов
/ 26 августа 2018

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

Я использовал эту ссылку в качестве ссылки

Вот мой код на контроллере:

[Route("api/email")]
public class EmailController : Controller
{
    private ContentManagement _contentManagement;
    public EmailController(ContentManagement contentManagement)
    {
        _contentManagement = contentManagement;
    }

    [HttpGet("async")]
    public async Task<IActionResult> GetAsync()
    {
        DateTime cur = DateTime.Now;
        var name = await _contentManagement.GetNameAsync();

        return Ok($"Value   : {name} \nStarted  : {cur.TimeOfDay}\n Ended   : {DateTime.Now.TimeOfDay}");
    }
    [HttpGet("normal")]
    public IActionResult Get()
    {
        DateTime cur = DateTime.Now;
        var name = _contentManagement.GetName();
        return Ok($"Value   : {name} \nStarted  : {cur.TimeOfDay}\n Ended   : {DateTime.Now.TimeOfDay}");

    }
}

Класс contentManagement точно такой же, как и в приведенной выше ссылке.

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

Вот мои результаты:

enter image description here

Кто-нибудь может оставить отзыв, если я что-то упустил или сделал что-то не так?

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

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Основной причиной запуска асинхронного кода является эффективное использование вычислительных ресурсов. Async - это , а не чудотворная строка кода, которая заставит другой код работать быстрее.

В вашем случае при использовании async-await вы в основном будете эффективно использовать потоки в пуле потоков. Давайте пройдемся по этому упрощенному объяснению.

Если мы сначала посмотрим на ваш метод синхронизации. Когда ваш поток достигнет этой строки var name = _contentManagement.GetName();, он будет ждать, пока не вернет имя. Во время обработки GetName () поток абсолютно ничего не сделает. Он просто будет заблокирован в ожидании ответа.

Асинхронный метод однако; Когда ваш поток достигнет этой строки var name = await _contentManagement.GetNameAsync();, он узнает, что этот метод помечен await, и тогда поток может свободно вернуться в пул потоков для обслуживания других вещей во время обработки GetNameAsync. Затем, когда GetNameAsync будет завершен, поток будет отправлен из пула потоков для продолжения следующей строки.

Таким образом, мы можем выполнять ту же логику, но при этом использовать меньше ресурсов ( мы экономим время потока при обработке внешних асинхронных вызовов )

0 голосов
/ 26 августа 2018

async-await не сделает это быстрее. На самом деле, это сделает его медленнее.

Реальная выгода - отзывчивость. Освобождение потока пользовательского интерфейса, освобождение потока, обрабатывающего веб-запрос, и т. Д.

Вам понадобится более одного одновременного запроса, чтобы увидеть разницу.

...