2017-01-17 4 views
2

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

result= await DataAccess.Query(param); //Query 
    await DataAccess.Create(result); 
    await DataAccess.Update(result); 
  1. мне действительно нужно использовать ждать здесь делать?

  2. Правильно ли использовать async void в функции создания и обновления?

  3. Какой будет правильный подход, чтобы сделать пожара и забыть здесь?
  4. Если я не упомянул асинхронный, это будет огонь и забыли?
  5. Каково значение async без ожидания, если он используется только для синхронного запуска? Я даже могу добиться этого без этого ключевого слова.
+0

если это огонь и забыть, то почему вы назначаете ответ на «результат»? Вы можете достичь огня и забыть с помощью 'Task.Run (() =>)' и даже связать их с 'ContinueWith'. Не забудьте поставить 'ConfigureAwait (false)' в конце –

ответ

3

данных не ожидается возврат обратно.

Как насчет ошибок? Нужно ли возвращать код ошибки при возникновении ошибки или 200 OK приемлемо, даже если Create или Update не удается?

Я предполагаю, что вам понадобится код ошибки. 99,99% звонков.

Нужно ли мне здесь пользоваться?

Ну, если вы хотите синхронных методов, то вы можете просто вызвать синхронный API. Хотя я не знаю, зачем вам это нужно.

Напоминание: await имеет ничего делать с возвратом в браузер. Он имеет все, что связано с использованием меньшего количества потоков пулов потоков, что позволяет вашему серверу масштабироваться дальше.

Правильно использовать async void в функции создания и обновления?

Нет. Никогда.

Какой будет правильный подход, чтобы сделать огонь и забыть здесь?

Правильный подход - «не делать». Пожар-и-забыть трудно сделать правильно, и на самом деле, так как вам нужен код ошибки, вы не можете сделать огонь и забыть.

Я пишу больше о пожаре и забывании - включая почему StartNew и Task.Run являются недействительными решениями - on my blog. Обратите внимание, что единственным полностью надежным решением (включая сценарии обновления) является последнее (распределенная архитектура).

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

Это работает серийно (в порядке), а не синхронно (блокирующий поток). Преимущество async - обеспечить большую масштабируемость. Для получения дополнительной информации см. Мою статью intro to async on ASP.NET.

0

Если вам нужно вызвать несколько методов в определенном порядке, но весь этот набор функций может выполняться асинхронно, я хотел бы сделать:

Task.Run(() => 
{ 
    result = Function(); 
    Create(result); 
    Update(result); 
}); 

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

Если функции определяются как в асинхронном, вы можете ждать их, чтобы закончить так:

Task.Run(() => 
{ 
    var task = Function(); 
    task.Wait(); 
    var result = task.Result; 

    Create(result).Wait(); 
    Update(result).Wait(); 
}); 

Но когда вы не собираетесь воспользоваться асинхронными методами, это будет лучше переопределить методы для запускать синхронно и использовать первый код

Смежные вопросы