Как не ждать долгого выполнения асинхронного метода задачи? - PullRequest
0 голосов
/ 28 июня 2019

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

У меня есть сценарий, в котором мне нужно вставить некоторые значения в базу данных и вернуть результат. Но мне не нужно ждать, чтобы закончить все вставки, прежде чем возвращать экземпляр объекта.

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

async Task<DataService> InitializeAsync()
{
   _dataService = new DataService(); 
   await _dataService.InsertCodeDescriptionAsync();
   await _dataService.InserHeadersAsync(); 
   return _dataService; 
}

Я думаю, что могу сделать это, изменив InsertCodeDescriptionAsync и InsertHeadersAsync на асинхронную пустую функцию. Но это не очень хорошо в соответствии с некоторыми статьями, которые я прочитал. Так что было бы лучше всего сделать в этом сценарии?

Обновление: Цель состоит в том, чтобы инициализировать dataService и выполнить вставку в фоновом режиме.

Ответы [ 3 ]

3 голосов
/ 28 июня 2019

Хорошо, мой предложенный ответ является двойным:

Простой ответ: если вам не нужно ждать задания, не ждите его.

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

Если так, то я бы по-прежнему предлагал использовать await, даже если вам не нужны методы для завершения сразу. Это, однако, гарантирует, что методы в какой-то момент завершены, а влияние на производительность часто минимально, особенно в многопоточном сценарии, поскольку именно тогда срабатывает асинхронная магия и освобождает много времени ЦП во время ожидания.

Если вы хотите иметь скорость и надежность, вы можете сделать что-то вроде

(DataService, Task) InitializeAsync()
{
 _dataService = new DataService(); 
 var t = Task.WhenAll(_dataService.InsertCodeDescriptionAsync(), _dataService.InserHeadersAsync());
 return (_dataService, t); 
}

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

2 голосов
/ 28 июня 2019

не ждите задач, которые вы не хотите ждать. что-то вроде ниже будет работать для вас.

Task<DataService> InitializeAsync()
{
   _dataService = new DataService(); 
   _dataService.InsertCodeDescriptionAsync();
   _dataService.InserHeadersAsync(); 
   return Task.FromResult(_dataService); 
}
0 голосов
/ 28 июня 2019

Вы можете полностью избавиться от async и await:

DataService Initialize()
{
    _dataService = new DataService(); 
    var fireAndForgetTask1 = _dataService.InsertCodeDescriptionAsync();
    var fireAndForgetTask2 = _dataService.InsertHeadersAsync(); 
    return _dataService; 
}

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

...