Task.WaitAll () прервано внутри Task.Run () - PullRequest
0 голосов
/ 17 октября 2018

У меня есть контроллер web api 2, клиент запрашивает контроллер для некоторого вида поколений html (состоит из изображений, файлов и т. Д.).Поскольку процессу требуется некоторое время, и я не хочу, чтобы пользователи ждали, я использовал следующий подход в контроллере:

...Controller(){
Task.Run(() =>
        {
          //calling heavy duty method to download files where Task.WaitAll() resides
          DownloadAndRename()
        });
}

DownloadAndRename(){
     //created some child task here and run them in task.waitall()
     //Task.WaitAll() here
}

Я создал задачи для каждого файла для загрузки, переименования и других процессов.,Затем выполните их в Task.WaitAll ().

Когда я запускаю приложение локально, все в порядке.Но когда я выполнял развертывание на своем тестовом сервере, он выдавал следующее исключение:

Message: System.Threading.ThreadAbortException: Thread was being aborted.

PS На моем компьютере в пуле приложений работает только одно приложение, тогда как на моем тестовом сервере их 8Конкретный пул.

Как мне преодолеть исключение?

Обновление 1: я попытался, удалив task.WaitAll и выполнить реализацию без использования Task .Тем не менее, я получаю ошибку прерывания потока, я думаю, что каким-то образом время ожидания Task.Run () истекло.

1 Ответ

0 голосов
/ 17 октября 2018

Я думаю, что проблема заключается в простом неправильном понимании реализации задачи.

Если вы хотите, чтобы задача выполнялась немедленно в качестве фоновой задачи, вы можете добавить ключевое слово async и тип возврата Task в действие Controller и сделать DownloadAndRename() асинхронно и заставить его вернуть задачу, а затем ожидать DownloadAndRename () из области действия контроллера.Вызывающий поток не будет заблокирован таким образом, и любой код после задачи не будет выполнен до тех пор, пока возвращаемая задача не будет завершена.

async Task Controller()
{
await DownloadAndRename();
}

Если после удаления Task.WaitAll () это все еще не работаетЯ бы прочел об этом, так как это может действительно истечь, как вы сказали, или может быть исключением по другой причине: Почему я получаю «Поток был прерван» в asp.net?

...