2015-02-23 4 views
0

У меня есть сайт MVC, где я пытаюсь вызвать метод с async. Мой код, как показано ниже:mvc async await link click wait wait task task

Просмотры

<a href="#" class="submit-download" data-id="24589">Submit Download</a> 

    $(document).on('click', '.submit-download', function (evt) { 
     var submit_url = '/SubmitDownloads/24589; 

     $.ajax({ 
      type: 'POST', 
      url: submit_url, 
      success: function (data) { 
       if (data.Item1) 
         location.reload(); 

      } 
     }); 

    }); 

Контроллер

[HttpPost] 
    public async Task<JsonResult> SubmitDownloads(int id) 
    { 
     var respository = new WorkflowRepository(); 
     var result = await respository.SubmitAsync(id); 
     return Json(result, JsonRequestBehavior.AllowGet); 
    } 

Repository Метод

//db service call which will take much longer time 
    public async Task<Tuple<bool, string>> SubmitAsync(id) 
    { 
     //long running method here 
     await Task.Delay(20000); 
     return new Tuple<bool, string>(true, "done with " + id); 

    } 

Когда пользователь нажимает на ссылку «Отправить Загрузка» в «Представлениях», она быстро выполняет всю функцию, так как ее предполагается делать, а страница показывает отзывчивое, как прокручиваемое, меню отлично видно. Но когда я нажимаю на любую ссылку на странице, она ждет завершения всей операции (20 секунд), а затем перенаправления на соответствующий URL.

Если я изменил задачу. Делай на 50 секунд, ссылка перейдет на 50 секунд для перенаправления.

Не могли бы вы рассказать мне, что мне не хватает здесь?

+0

Что вы, кроме как случиться? –

ответ

1

Но когда я нажимаю на любую ссылку на странице, она ждет завершения всей операции (20 секунд), а затем перенаправляется на соответствующий URL-адрес.

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

Когда вы нажимаете на ссылку, браузеру требуется, чтобы дождаться ответа раньше, ну, обрабатывая этот ответ (отображая страницу). Невозможно отобразить страницу, не дожидаясь отправки этой страницы с веб-сервера.

+0

Есть ли способ, которым я могу положить это в фоновом режиме? Похоже, что страница разбилась, но не отображается сообщение об ошибке. – sarojanand

+0

@sarojanand: Если загрузка страницы занимает много времени, я думаю, вы захотите исправить все, что вызывает это. Возможно, серверный код может порождать отдельный поток для выполнения долговременной задачи, или, возможно, веб-приложение может поставить в очередь информацию о задаче в базе данных, и совершенно отдельный процесс (например, служба Windows) может контролировать эту базу данных и выполнять длительные задания отдельно? (Это вообще то, что я сделал бы.) Ответы на веб-страницы - это не лучшее место, чтобы положить вещи, которые занимают много времени. – David

+0

Дэвид, я понимаю, что вы говорите. Сервисный код в порядке, его просто нужно делать много операций ввода-вывода, а затем вычислять, он занимает 10-30 секунд на основе данных. Поэтому мы ничего не можем сделать, чтобы его оптимизировать. Вот почему мы думаем сделать наш интерфейс более отзывчивым, используя Задачи. – sarojanand