2015-07-14 4 views
0

У меня есть приложение ASP.NET MVC, написанное на C#. Один из моих действий выглядит следующим образом:Выполнить код асинхронно в C#

[HttpPost] 
public async Task<ActionResult> Save(int id, MyViewModel viewModel) 
{ 
    viewModel.SaveToDb(); 

    await Backup.Save(viewModel); 
    return View(viewModel); 
} 

...

public class Backup 
{ 
    async public static Task Save(IBackup item) 
    { 
    // do stuff 
    } 
} 

Существует на самом деле очень много происходит в функции Backup.Save. Фактически, await Backup.Save(...) в настоящее время занимает 10 секунд. По этой причине я хочу запустить его в фоновом режиме (асинхронно), а не (а) ждать на нем. Я думал, что если я просто удалю ключевое слово await, это сработает. Однако, похоже, это не так.

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

Спасибо!

+2

Вам нужен надежный метод создания фоновой работы в ASP.NET, как описано [здесь] (http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx). – mason

+0

Узнайте о TPL, task.run(), – Gilad

+1

Это не то, что async/await для – Jonesopolis

ответ

2

Смотрите здесь для обсуждения этого: Can I use threads to carry out long-running jobs on IIS?

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

Если вам нужна модель просмотра сразу, то можно разделить ее на два метода. Тот, который получает модель представления, а затем вы вызываете второй метод, который выполняет сохранение в фоновом режиме.

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

Это немного взломанный, так как клиент теперь запрашивает действие, которое может не понадобиться знать или заботиться.

0

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

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

+1

Просто «Запуск потока» в ASP.NET сложнее, чем это. IIS закроет AppDomain до вас, прежде чем ваша задача будет завершена. –

+0

Ну, спасибо за это, не знал, что –

+0

Прочтите вопрос SO [Могу ли я использовать потоки для выполнения длительных заданий на IIS?] (Http://stackoverflow.com/questions/536681/cani-i- use-threads-to-perform-out-long-running-jobs-on-iis) для получения дополнительной информации. –

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