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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

Блин, у людей столько проблем с этим WebRequest и подобным legacy, но все равно все упорно продолжают грызть кактус вместо того чтобы использовать HttpClient.
...
Рейтинг: 0 / 0
Прибить таск
    #40022364
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
он в соседнем проекте в солюшене
ты чего прям как новичок на форуме Это не сторонний код.
Antonariy
через HttpRequest
Ну так какой же он неотменяемый? Очень даже отменяемый. Другое дело, за древностью он не поддерживает схему отмены через токены, но ее можно эмулировать, ссылку на пример дали выше. Но лучше, конечно, по возможности переписать на HttpClient.
Antonariy
пробросить какой-нибудь
нужно просто сделать всю цепочку вызова асинхронной, ну и классически с токеном. И только на конце уже для самого HttpRequest сделать отмену по-старому
...
Рейтинг: 0 / 0
Прибить таск
    #40022409
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
убить можно только поток или процесс, но делать этого нельзя, за такое нужно бить по рукам.
...
Рейтинг: 0 / 0
Прибить таск
    #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
Прибить таск
    #40022414
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЭто не сторонний код.Я специально так сформулировал задачу в надежде на существование решения в этом виде.

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


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