powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / task abort
15 сообщений из 15, страница 1 из 1
task abort
    #39322155
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть такой класс врапер
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
public class BackgroundTaskWrapper
    {
        private static ILog log = LogManager.GetLogger<BackgroundTaskWrapper>();
        private static readonly ConcurrentDictionary<Guid, Task> ProcessTokens = new ConcurrentDictionary<Guid, Task>();

        public static void SetTask(Guid token, Action action)
        {
            var ts = Task.Factory.StartNew(() =>
            {
                try
                {
                    action();
                }
                catch (Exception e)
                {                   
                    log.Error("Error", e);
                }

            }, TaskCreationOptions.LongRunning).ContinueWith(x =>
            {
                RemoveTask(token);
            });
            AddOrUpdate(token, ts);
        }

        public static bool IsRun(Guid key)
        {
            var t = Get(key);
            return t != null;
        }

        private static void RemoveTask(Guid key)
        {
            var t = Get(key);
            if (t != null && t.Exception != null)
            {
                ILog log = LogManager.GetLogger<BackgroundTaskWrapper>();
                log.Error("Error in BackgroundTaskWrapper", t.Exception);
            }
            var tt = Remove(key);
        }

        private static Task AddOrUpdate(Guid keyvalue, Task value)
        {
            return ProcessTokens.AddOrUpdate(keyvalue, value, (key, existingVal) => value);
        }

        private static Task Remove(Guid key)
        {
            Task temp;
            ProcessTokens.TryRemove(key, out temp);            
            return temp;
        }

        private static Task Get(Guid key)
        {
            Task temp;
            ProcessTokens.TryGetValue(key, out temp);
            return temp;
        }
    }


как вызываю
Код: c#
1.
2.
3.
4.
 BackgroundTaskWrapper.SetTask(token, () =>
            {
             some long action          
            });


как проверяю
Код: c#
1.
 BackgroundTaskWrapper.IsRun(token);


опишу для чего он нужен, задумывался. есть задачи которые на сервисе я не жду окончания выполнения .а даю им ключ-маркер и периодически проверяют завершилась ли таска, например копирование папки, разархивирования архива. но вижу в логах Thread was being aborted. что то канселит задачу. вызывал метод который дергаю на серваке без этой обертке и все срабатывает, но тут я не знаю когда завершилось. видимо я где то накосячел в этом в врапере. тыкните носом где я облажался. возможно в корне по другому надо было подойти к задаче?
п.с. cancellationToken не использую, так как я не сбрасываю принудительно задачи сам, мне важно чтоб они завершились и понять результат.
...
Рейтинг: 0 / 0
task abort
    #39322188
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Thread was being aborted - где такое выходит?
...
Рейтинг: 0 / 0
task abort
    #39322266
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

ну в моем случаем в функции распаковки я логах я вижу эту ошибку и естественно распаковывается не все
...
Рейтинг: 0 / 0
task abort
    #39322370
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Asp.Net убивает таски, выходящие за пределы метода контроллера.

1. Можно вынести в отдельную службу и организовать взаимодействие с ней через, например, WCF.

2. Можно самостоятельно создать Thread, без обёртки в виде Task. Такие потоки Asp.Net убивать не умеет. Подумать о соответствующей настройке времени жизни IIS.
...
Рейтинг: 0 / 0
task abort
    #39322382
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu,

Если хочешь в одном приложении, заюзай Quartz. А так да, лучше всего отдельная служба.
...
Рейтинг: 0 / 0
task abort
    #39322387
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttА так да, лучше всего отдельная служба.Или запускать задачи через "Планировщик заданий", имеющий API для этого. Задания оформлять, например, консольными приложениями.
...
Рейтинг: 0 / 0
task abort
    #39322390
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVosttА так да, лучше всего отдельная служба.Или запускать задачи через "Планировщик заданий", имеющий API для этого. Задания оформлять, например, консольными приложениями.

Ну это уже решение в лоб )) Правда тогда не получится отслеживать процесс выполнения, только завершилась или нет.
...
Рейтинг: 0 / 0
task abort
    #39322403
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей Кпропущено...
Или запускать задачи через "Планировщик заданий", имеющий API для этого. Задания оформлять, например, консольными приложениями.

Ну это уже решение в лоб )) Правда тогда не получится отслеживать процесс выполнения, только завершилась или нет.Обычно этого достаточно. Но даже если прогресс потребуется, то способов организовать взаимодействие между IIS <=> "консольное приложение" достаточно. Да пусть хоть в БД пишет прогресс выполнения, в лог какой-нибудь.
...
Рейтинг: 0 / 0
task abort
    #39322405
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

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

hVostt ,
ну я фанат Quartz) но чет не зашло в голову что можно его тут применить. хотя уже вариант есть как это сделать. но думаю пока простецкий вариант Алексея заюзаю с Thread

спасибо что направили)
...
Рейтинг: 0 / 0
task abort
    #39322413
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRuпростецкий вариант Алексея заюзаю с ThreadПовторюсь, тогда надо будет не забыть отключить в IIS выгрузку приложения при отсутствии обращений от клиентов.

Есть ещё HostingEnvironment.QueueBackgroundWorkItem . Оно вроде как должно предупреждать нежелательную выгрузку приложения IIS.

С тасками я походу немного напутал. Там возникали ошибки, если при завершении метода контроллера оставались незавершённые таски, порождённые данным методом. Например:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class MyController : ApiController
{
    // Что-то такое там давало ошибку, точно не помню, проверять лень. :-)
    public void Action1()
    {
         // В этом случае замена на явное создание Thread позволяет обойти контроль со стороны Asp.Net.
         Task.Run(() => { Thread.Sleep(5000); });
    }
}

Это возможно не совсем то, о чём идёт речь.
...
Рейтинг: 0 / 0
task abort
    #39322431
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhandmadeFromRuпростецкий вариант Алексея заюзаю с ThreadПовторюсь, тогда надо будет не забыть отключить в IIS выгрузку приложения при отсутствии обращений от клиентов.

оно мне даже не пригодиться, после запуска задачи я пингую её раз в секунду спрашивая состояние т.е. не выгрузиться
...
Рейтинг: 0 / 0
task abort
    #39322432
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRuАлексей Кпропущено...
Повторюсь, тогда надо будет не забыть отключить в IIS выгрузку приложения при отсутствии обращений от клиентов.

оно мне даже не пригодиться, после запуска задачи я пингую её раз в секунду спрашивая состояние т.е. не выгрузитьсяСогласен. :-)
...
Рейтинг: 0 / 0
task abort
    #39322443
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к сожалению тоже самое
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
System.Threading.ThreadAbortException: Thread was being aborted.
   at Ionic.Crc.CRC32.SlurpBlock(Byte[] block, Int32 offset, Int32 count)
   at Ionic.Crc.CrcCalculatorStream.Read(Byte[] buffer, Int32 offset, Int32 count)
   at Ionic.Zip.ZipEntry.ExtractAndCrc(Stream archiveStream, Stream targetOutput, Int16 compressionMethod, Int64 compressedFileDataSize, Int64 uncompressedSize)
   at Ionic.Zip.ZipEntry.ExtractToStream(Stream archiveStream, Stream output, EncryptionAlgorithm encryptionAlgorithm, Int32 expectedCrc32)
   at Ionic.Zip.ZipEntry.InternalExtractToBaseDir(String baseDir, String password, ZipContainer zipContainer, ZipEntrySource zipEntrySource, String fileName)
  at Helpers.FileHelper.UnZippingFile(String existingZipFile, String targetDirectory, String password)
...   


перейди значит к сервису
...
Рейтинг: 0 / 0
task abort
    #39322467
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм а нет, если я делаю просто долгое копирование все работает, даже с тасками. эт конкретно изза библы в данном случаем DotNetZip, не хочет работать в потоке в таком варианте, придеться ковыряться в сорсах
...
Рейтинг: 0 / 0
task abort
    #39324200
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRuхм а нет, если я делаю просто долгое копирование все работает, даже с тасками. эт конкретно изза библы в данном случаем DotNetZip, не хочет работать в потоке в таком варианте, придеться ковыряться в сорсах

Отдельная служба или отдельное (консольное) приложение при всех равных прочих, оказывается самым надёжным и простым вариантом.

Единственная проблема с деплоем, есть разница: одну приложуху деплоить или несколько.

Но и тут есть простые решения, зацени Осьминога .
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / task abort
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]