Из-за некоторых проблем оптимизации я решил переписать метод действия контроллера на асинхронный. Это многоуровневое приложение, и с тех пор я столкнулся с проблемой архитектуры, и мне интересно, какие основные отличия между двумя утверждениями я покажу ниже. Скажем, мой синхронный метод:Async/Await и многоуровневое веб-приложение
public virtual ActionResult Method()
{
SomeLogic.LargeOperation();
return View(...);
}
LargeOpertation делает много. Вот псевдокод:
public void LargeOpertion() {
DatabaseManipulations1();
IndependentWork();
CallingToWebService1();
IndependentWork();
DatabaseManipulations2();
IndependentWork();
CallingToWebService2();
IndependentWork();
}
Каждый метод внутри LargeOperations имеет методы пары внутри себя, и так далее ... Возникает вопрос: Нужен ли, чтобы сделать их все асинхра и использование ждет почти каждый из прикладного уровня?
public virtual Task<ActionResult> Method()
{
await SomeLogic.LargeOperation();
return View(...);
}
public async Task LargeOpertion() {
await DatabaseManipulations1();
IndependentWork();
await CallingToWebService1();
IndependentWork();
await DatabaseManipulations2();
IndependentWork();
await CallingToWebService2();
IndependentWork();
}
Или я могу просто использовать задачу на LargeOpertaion так:
public virtual Task<ActionResult> Method()
{
await Task.Run(() => SomeLogic.LargeOperation());
return View(...);
}
Давайте также предположим, что IndependentWork() не столь велика.
Как долго длится/Мы говорим минут? 1 секунда? часы? – Phill
Если 'LargeOperation' является асинхронным, пусть он возвращает' Task', в противном случае используется 'Task.Run (() => SomeLogic.LargeOperation());'. Кроме этого я не понимаю ваш вопрос. –
Предположим, что в CallingToWebService1 есть операции, которые могут длиться около 2 минут, а в DatabaseManipulations1(), DatabaseManipulations2(), CallingToWebService2() 1 мин. – user3558203