C # MVC Async Task & lt; & gt; Конфликт пульта управления [дубликат]

Самое простое решение - создать функцию JavaScript и вызвать его для обратного вызова Ajax success.

function callServerAsync(){
    $.ajax({
        url: '...',
        success: function(response) {

            successCallback(response);
        }
    });
}

function successCallback(responseObj){
    // Do something like read the response and show data
    alert(JSON.stringify(responseObj)); // Only applicable to JSON response
}

function foo(callback) {

    $.ajax({
        url: '...',
        success: function(response) {
           return callback(null, response);
        }
    });
}

var result = foo(function(err, result){
          if (!err)
           console.log(result);    
}); 
5
задан Yuval Itzchakov 24 May 2015 в 05:34
поделиться

3 ответа

await, как вы выяснили, блокирует ответ от возврата пользователю до его завершения. Обычно вы просто помещаете фоновый рисунок в другой поток и устанавливаете его «стрелять и забывать», не ожидая, однако в ASP.NET IIS отключит AppDomains, которые не используются, и Task.Run не сообщает IIS, что ваш фон thread "использует AppDomain", поэтому ваш фоновый поток может быть завершен с помощью Thread.Abort() во время отключения AppDomain.

Если вы используете .NET 4.5.2 или новее, вы можете сказать, что у IIS есть фон что вам нужно оставаться в живых через QueueBackgroundWorkItem . Вы бы использовали его так:

   public ActionResult ProcessRec()
   {
        HostingEnvironment.QueueBackgroundWorkItem(waitTimer);
        return RedirectToAction("Index", "Home");
   }

   public void waitTimer(CancellationToken token)
   {
        Thread.Sleep(10000);
   }
   //You also could do
   public async Task waitTimer2(CancellationToken token)
   {
        await Task.Delay(10000);
   }

Теперь это не гарантирует, что IIS не выключит ваш домен приложения, но он знает, что вы находитесь посреди чего-то, и просит больше времени, когда он (вы получаете до 90 дополнительных секунд после того, как по умолчанию запускается завершение завершения всех заданных по умолчанию элементов фона).

Для получения дополнительной информации прочтите этот блог MSDN представляя его.

4
ответ дан Scott Chamberlain 31 August 2018 в 23:04
поделиться

Я собираюсь отправить сообщение в очередь (например, azure storage / service bus queue), чтобы вы могли немедленно получить ответ.

Затем создайте еще одну службу для удаления и обработки сообщения (выполнить свою долговременную задачу)

Также, если это лазурный веб-сайт (веб-приложение), вы можете использовать веб-работу!

Надеюсь, что это поможет.

1
ответ дан Ryan Chu 31 August 2018 в 23:04
поделиться

Это, однако, ждет все 10 секунд, прежде чем перенаправить меня на мое действие «Index, Home».

Правильно, это потому, что await асинхронно ждет завершения операций , Он вернет поток обратно в пул, пока операция не завершится.

Как заставить приложение вернуться к этому действию, а waitTimer выполняется в фоновом режиме?

Task.Run опасен в том, что он не регистрирует работу с IIS , что может привести к проблемам . Вместо этого вы можете использовать BackgroundTaskManager или HangFire , которые регистрируют его выполнение с помощью ASP.NET:

BackgroundTaskManager.Run(() => { waitTimer() };
return RedirectToAction("Index", "Home");
2
ответ дан Yuval Itzchakov 31 August 2018 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: