Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Прибить таск / 25 сообщений из 26, страница 1 из 2
25.11.2020, 21:30
    #40022230
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
Запускаю в таске синхронную операцию, чтобы не блокировала интерфейс.
Расхотелось дожидаться ее завершения, хочу прибить.
В таске вызывается посторонний долгий метод, то есть способ проверять состояние токена как здесь не канает, а Task.Dispose тупо валит всё приложение.
Можно ли его прибить, чтобы посторонний метод прекратил работу и не сделал то, что должен?
...
Рейтинг: 0 / 0
25.11.2020, 21:35
    #40022231
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
Antonariy,
можно код посмотреть, в котором таску нельзя через CancellationToken отменить?
Как костыль, но рабочий возможно подойдет TaskCompletionSource.
...
Рейтинг: 0 / 0
25.11.2020, 21:41
    #40022233
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
Ну например такой:

Код: c#
1.
2.
var cancellation = new CancellationTokenSource();
var task = Task.Run(() => Thread.Sleep(5000000), cancellation.Token);
...
Рейтинг: 0 / 0
25.11.2020, 21:52
    #40022238
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
vb_sub
Antonariy,
можно код посмотреть, в котором таску нельзя через CancellationToken отменить?
Как костыль, но рабочий возможно подойдет TaskCompletionSource.

Чтобы "прибить" таску через CancellationToken надо чтобы таска сама проверила его состояние. Токен это просто сигнал для таски, что, давай, типа, закругляйся, не нужна ты уже. А TaskCompletionSource он тоже не для того. Он чтобы создавать таски с "кастомной" асинхронностью. Например завершением таска по какому-то событию, приходом сообщения, и т.п.
...
Рейтинг: 0 / 0
25.11.2020, 22:04
    #40022244
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
Antonariy
посторонний долгий метод
этот посторонний метод отмену поддерживает? если не поддерживает, то как он узнает, что ты хочешь его отменить? Если поддерживает, запускаешь await Task.Delay(n, token). Как токен отменился, отправляешь отмену постороннему методу.
...
Рейтинг: 0 / 0
25.11.2020, 22:09
    #40022246
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
Shocker.Pro
этот посторонний метод отмену поддерживает?

Судя по автор способ проверять состояние токена как здесь не канает,не поддерживает. Я так исходный посыл понял, что проблема как раз в этом.
...
Рейтинг: 0 / 0
25.11.2020, 22:12
    #40022248
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
По ссылке, кстати, написано гамно:
Код: c#
1.
2.
3.
4.
5.
if (token.IsCancellationRequested)
{
    Console.WriteLine("Операция прервана токеном");
    return;
}

потому что при отмене таска положено ексепшен бросать, а не завершать его ретурном.
...
Рейтинг: 0 / 0
25.11.2020, 22:19
    #40022251
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
fkthat
Судя по автор способ проверять состояние токена как здесь не канает,
не поддерживает.я имею ввиду не поддержку CancellationToken-а, а какой-то иной способ. Иначе какой смысл знать, что у тебя что-то отменено, если ты не можешь отменить вызванный метод. Может он вообще WinAPI дергает )
...
Рейтинг: 0 / 0
25.11.2020, 22:26
    #40022255
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
Shocker.Pro
Antonariy
посторонний долгий метод
этот посторонний метод отмену поддерживает? если не поддерживает, то как он узнает, что ты хочешь его отменить? Если поддерживает, запускаешь await Task.Delay(n, token). Как токен отменился, отправляешь отмену постороннему методу.
Не поддерживает и никак не узнает.
Вок как снимаешь задачу через диспетчер задач, так же с таском. Таск же поток создает, если я не ошибаюсь? Вот нужно просто замочить поток по беспределу, такому же, как задачу.
...
Рейтинг: 0 / 0
25.11.2020, 22:37
    #40022260
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
Antonariy
Не поддерживает и никак не узнает.

Значит, задача нерешаемая, потому что
Antonariy
Таск же поток создает
это в корне неверно. Там внутри может вообще никакого другого потока вовсе и не быть, как пример, если это таск асинхронного i/o.
...
Рейтинг: 0 / 0
25.11.2020, 22:39
    #40022264
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
Shocker.Pro
я имею ввиду не поддержку CancellationToken-а, а какой-то иной способ. Иначе какой смысл знать, что у тебя что-то отменено, если ты не можешь отменить вызванный метод. Может он вообще WinAPI дергает )

Ну, наверное, автор имел в виду аналог Thread.Abort , но для тасков.
...
Рейтинг: 0 / 0
25.11.2020, 23:14
    #40022281
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
fkthat
Antonariy
Не поддерживает и никак не узнает.

Значит, задача нерешаемая, потому что
Antonariy
Таск же поток создает
это в корне неверно. Там внутри может вообще никакого другого потока вовсе и не быть, как пример, если это таск асинхронного i/o.


А Thread?
...
Рейтинг: 0 / 0
25.11.2020, 23:15
    #40022283
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
fkthat
Shocker.Pro
я имею ввиду не поддержку CancellationToken-а, а какой-то иной способ. Иначе какой смысл знать, что у тебя что-то отменено, если ты не можешь отменить вызванный метод. Может он вообще WinAPI дергает )

Ну, наверное, автор имел в виду аналог Thread.Abort , но для тасков.

Где-то прочитал, что Thread.Abort deprecated, таки он уже всё наверное?
...
Рейтинг: 0 / 0
25.11.2020, 23:21
    #40022284
AvaiatorNester
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
Antonariy, единственный надежный способ убить задачу, которая не поддерживает отмену и вы не можете изменить код - это создать отдельный процесс и выполнять задачу в этом процесс, при создании вы получите идентификатор процесса, по этому идентификатору можно убить процесс, вместе с этим ОС освободит все ресурсы автоматически.

Если вы даже создадите отдельный поток и запустите в нем ваш задачу, и если вызовите Thread.Abort, то не факт, что поток остановится, Thread.Abort тоже выставляет спец. флаг, который проверяют некоторые системные функции, и если флаг выставлен, то бросается исключение, но если даже ваша задача вызывает те системные функции, которые проверяют флаг и бросают исключение, то ресурсы, которые получила ваша задача для выполнения могут быть не освобождены, поэтому только отдельный процесс.
...
Рейтинг: 0 / 0
26.11.2020, 00:02
    #40022294
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
AvaiatorNester
поэтому только отдельный процесс.

Не вариант.
Придется терпеть исполняемые таски, пока не закончат работу.
...
Рейтинг: 0 / 0
26.11.2020, 00:08
    #40022296
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
Antonariy,

Какой-то варварский способ. Зачем это всё? ))
...
Рейтинг: 0 / 0
26.11.2020, 02:10
    #40022318
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
Antonariy
Где-то прочитал, что Thread.Abort deprecated, таки он уже всё наверное?

Да, проверил, он всё. В Core и 5 он уже и не работает - сам кидает ексепшен. Я и не знал - не могу просто вспомнить, чтобы он мне когда-либо нужен был.
...
Рейтинг: 0 / 0
26.11.2020, 07:54
    #40022332
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
Можно завернуть этот неотменяемый Task в другой Task на основе TaskCompletionSource, для которого CancellationToken будет вызывать TrySetCanceled внутри Register, и возвращать первый выполненный Task. Этот длинный неотменяемый Task не отменится, и будет работать где-то там фоном, но на уровне кода вполне будет, как будто его отменили. Если не жалко ресурсов, которые потребляет этот неотменяемый Task, то вполне можно сделать так. Детали есть, например, здесь .
...
Рейтинг: 0 / 0
26.11.2020, 07:54
    #40022333
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
hVostt
Antonariy,

Какой-то варварский способ. Зачем это всё? ))
Хочется - разве нужна иная причина?) Список исполняемых тасков есть, а возможности в него ткнуть и прикончить таск - нет. Непорядок.

С другой стороны, сторонний метод сторонний лишь формально, он в соседнем проекте в солюшене. Внутри него на самом нижнем уровне - долгий async/await-запрос через HttpRequest. Может можно до него пробросить какой-нибудь обьект, который прервет запрос?
...
Рейтинг: 0 / 0
26.11.2020, 08:00
    #40022336
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
Antonariy
долгий async/await-запрос через HttpRequest. Может можно до него пробросить какой-нибудь обьект, который прервет запрос?

https://stackoverflow.com/questions/19211972/getresponseasync-does-not-accept-cancellationtoken - ?
...
Рейтинг: 0 / 0
26.11.2020, 08:29
    #40022341
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
Сон Веры Павловны
Antonariy
долгий async/await-запрос через HttpRequest. Может можно до него пробросить какой-нибудь обьект, который прервет запрос?

https://stackoverflow.com/questions/19211972/getresponseasync-does-not-accept-cancellationtoken - ?

Блин, у людей столько проблем с этим WebRequest и подобным legacy, но все равно все упорно продолжают грызть кактус вместо того чтобы использовать HttpClient.
...
Рейтинг: 0 / 0
26.11.2020, 10:02
    #40022364
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
Antonariy
он в соседнем проекте в солюшене
ты чего прям как новичок на форуме Это не сторонний код.
Antonariy
через HttpRequest
Ну так какой же он неотменяемый? Очень даже отменяемый. Другое дело, за древностью он не поддерживает схему отмены через токены, но ее можно эмулировать, ссылку на пример дали выше. Но лучше, конечно, по возможности переписать на HttpClient.
Antonariy
пробросить какой-нибудь
нужно просто сделать всю цепочку вызова асинхронной, ну и классически с токеном. И только на конце уже для самого HttpRequest сделать отмену по-старому
...
Рейтинг: 0 / 0
26.11.2020, 12:35
    #40022409
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
убить можно только поток или процесс, но делать этого нельзя, за такое нужно бить по рукам.
...
Рейтинг: 0 / 0
26.11.2020, 12:39
    #40022411
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
Antonariy
Ну например такой:

Код: c#
1.
2.
var cancellation = new CancellationTokenSource();
var task = Task.Run(() => Thread.Sleep(5000000), cancellation.Token);


ваш пример ужасен, у Task.Delay есть аргумент для CancellationToken'а, лучше вообще забыть про Thread.Sleep и вообще про класс в целом
...
Рейтинг: 0 / 0
26.11.2020, 12:42
    #40022414
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прибить таск
Shocker.ProЭто не сторонний код.Я специально так сформулировал задачу в надежде на существование решения в этом виде.

Shocker.Proнужно просто сделать всю цепочку вызова асинхроннойМного еботни, ее изначально не планировали делать с возможностью отмены запросов, поэтому я хотел объехать на кривой кобыле. Не судьба.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Прибить таск / 25 сообщений из 26, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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