Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / task abort / 15 сообщений из 15, страница 1 из 1
06.10.2016, 17:01
    #39322155
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
task abort
есть такой класс врапер
Код: 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
06.10.2016, 17:25
    #39322188
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
task abort
Thread was being aborted - где такое выходит?
...
Рейтинг: 0 / 0
06.10.2016, 19:01
    #39322266
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
task abort
ЕвгенийВ,

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

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

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

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

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

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

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

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

спасибо что направили)
...
Рейтинг: 0 / 0
07.10.2016, 08:23
    #39322413
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
task abort
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
07.10.2016, 08:51
    #39322431
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
task abort
Алексей КhandmadeFromRuпростецкий вариант Алексея заюзаю с ThreadПовторюсь, тогда надо будет не забыть отключить в IIS выгрузку приложения при отсутствии обращений от клиентов.

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

оно мне даже не пригодиться, после запуска задачи я пингую её раз в секунду спрашивая состояние т.е. не выгрузитьсяСогласен. :-)
...
Рейтинг: 0 / 0
07.10.2016, 09:08
    #39322443
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
task abort
к сожалению тоже самое
Код: 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
07.10.2016, 09:29
    #39322467
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
task abort
хм а нет, если я делаю просто долгое копирование все работает, даже с тасками. эт конкретно изза библы в данном случаем DotNetZip, не хочет работать в потоке в таком варианте, придеться ковыряться в сорсах
...
Рейтинг: 0 / 0
11.10.2016, 09:22
    #39324200
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
task abort
handmadeFromRuхм а нет, если я делаю просто долгое копирование все работает, даже с тасками. эт конкретно изза библы в данном случаем DotNetZip, не хочет работать в потоке в таком варианте, придеться ковыряться в сорсах

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

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

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


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