|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
Что-то никак не врублюсь, как убить синхронный метод. Делаю "отзывчивый" интерфейс winforms с возможностью пользователю прервать выполнение задачи. В приведенном примере метод SyncLock имитирует долгий синхронный метод, внутрь которого я влезть не могу. Если пользоваться по старинке потоками, я его спокойно убиваю через thread.Abort(), обрабатываю исключение прерывания и спокойно завершаю задачу. В примерах с async/await приводится опрос токена, но я ведь не могу его проводить внутри чужого синхронного метода. Подскажите, где я не догоняю? Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 13:44 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
Основных варианта два: 1. Если асинхронная операция самописная - в одном из циклов обращаться к CancellationToken на предмет отмены. 2. Если асинхронная операция содержит вложенную асинхронную операция (асинхронное обращение к БД, сокету и т. п.) - передавать CancellationToken во вложенную асинхронную операцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 14:59 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
Еще раз. у меня есть СИНХРОННАЯ чужая операция. Я не могу влезть к ней внутрь. В примере подобную операцию представляет SyncLock Вопрос конкретно по примеру. Можно ли прервать выполнение SyncLock до его реального завершения (не внося изменения в SyncLock) используя работу с Task-ами? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 15:08 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
Shocker.ProЕще раз. у меня есть СИНХРОННАЯ чужая операция. Я не могу влезть к ней внутрь.Тогда никак. Только Thread.Abort. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 15:12 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
Получается тогда ерунда? Сделали Task, наворотили сахарных конструкций, при этом потерялась возможность насильно прервать выполнение? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 15:28 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
Shocker.ProПолучается тогда ерунда? Сделали Task, наворотили сахарных конструкций, при этом потерялась возможность насильно прервать выполнение? ерунду сморозил, ничто не потерялось, а Thread.Abort - зло ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 15:54 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
Shocker.ProЕще раз. у меня есть СИНХРОННАЯ чужая операция. Я не могу влезть к ней внутрь. В примере подобную операцию представляет SyncLock Вопрос конкретно по примеру. Можно ли прервать выполнение SyncLock до его реального завершения (не внося изменения в SyncLock) используя работу с Task-ами?У вас принципиальное непонимание того, как работает программа. Поток - это набор инструкций. Его нельзя взять, и остановить в произвольном месте. Любая операция по нормальной остановке какой-либо задачи выглядит следующем образом: 1) Когда вам надо остановить задачу, вы выставляете где-то флажок, что надо остановиться. 2) Сама задача периодически проверяет этот флажок, и если видит, что надо остановиться - останавливается. Принципиально так реализовано все. Так реализованы прерывания IO операций, так реализованы прерывания через CancellationToken, так реализованы прерывания ожидания всяких критических секций и условий, и т.д.. Разумеется, конечная реализация может отличаться - где-то это просто managed-переменная, где-то вызов какого-нибудь WinAPI, где-то вызов прерывания, и т.д.. Но суть одна - "первый поток ставит флажок, второй поток читает флажок". Вы же прерываете поток через Abort(). Это плохая, отвратительная практика. В Java, например, это вообще запрещено. И правильно, что запрещено - это дурной тон! А что, если ваш поток, например, сидел внутри критической секции и должен был консистентно изменить две переменные, а вы вызвали Abort, и он смог изменить только одну, оставив систему в неконсистентном состоянии? Abort() используют либо от лени, либо от непонимания. Если вас по каким-то причинам не устраивает cancellation token, то сделайте какой-нибудь volatile bool - один поток выставляет его, второй читает. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 15:56 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
Ну так при прерывании потока возникает эксепшен, вызывается финализатор, где я могу привести все в правильное состояние (в моем случае нужно только вернуть кнопку Start в состояние Enabled, а кнопку Stop - в disabled). cdtyjvЕсли вас по каким-то причинам не устраивает cancellation token, то сделайте какой-нибудь volatile bool - один поток выставляет его, второй читает.как мне дать возможность пользователю прервать синхронную операцию, нажав кнопку stop? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 16:05 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
Shocker.ProПолучается тогда ерунда? Сделали Task, наворотили сахарных конструкций, при этом потерялась возможность насильно прервать выполнение ?А она была, если забыть о thread.abort? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 17:02 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
А почему о нем надо забыть? Еще раз. Как мне дать возможность пользователю прервать синхронную операцию, нажав кнопку stop? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 17:10 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
Shocker.ProА почему о нем надо забыть? Еще раз. Как мне дать возможность пользователю прервать синхронную операцию, нажав кнопку stop? В обработчике клика поставьте Код: c# 1.
Правда будут некоторые побочные эффекты :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 17:20 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
cdtyjv, Вам в слове «чужая», что не понятно? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 17:23 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
Shocker.ProА почему о нем надо забыть? Еще раз. Как мне дать возможность пользователю прервать синхронную операцию, нажав кнопку stop? а зачем прерывать? долго выполняется и блокируется GUI ? если так, то запускай задание на выполнение и всё, интерфейс свободен, а останавливать его уже пользователю не надо давать, это не его дело. контролируй уже завершение самой задачи и выводи в пользовательский GUI инфу по событию ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 17:23 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
Shocker.ProА почему о нем надо забыть?Ладно, проехали... Shocker.ProЕще раз. Как мне дать возможность пользователю прервать синхронную операцию, нажав кнопку stop? 16260553 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 17:31 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
ЕвгенийВВ обработчике клика поставьте Код: c# 1.
это перезапустит всю прогу что ли? нафиг это надо, мне всего лишь надо прекратить выполнение задачи. Алексей КShocker.ProЕще раз. Как мне дать возможность пользователю прервать синхронную операцию, нажав кнопку stop? 16260553 но это тогда означает, что я не могу использовать преимущества Task? Или можно как-то получить тред из таска? Konst_Oneа зачем прерывать? долго выполняется и блокируется GUI ?Ну так да.Konst_Oneесли так, то запускай задание на выполнение и всё, интерфейс свободен, а останавливать его уже пользователю не надо давать, это не его дело. контролируй уже завершение самой задачи и выводи в пользовательский GUI инфу по событиюну можно, конечно, но как-то странно, висит никому не нужный процесс, что-то делает, грузит ввод-вывод, процессор.... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 17:57 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
Shocker.Proну можно, конечно, но как-то странно, висит никому не нужный процесс, что-то делает, грузит ввод-вывод, процессор.... нужный, раз клиент кнопку нажал на запуск ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 18:03 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
Shocker.ProАлексей Кпропущено... 16260553 но это тогда означает, что я не могу использовать преимущества Task? Или можно как-то получить тред из таска?Это можно завернуть в Task, добавятся определённые удобства. Но чудес не бывает, внутри всё равно будет использоваться thread.abort. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 18:03 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
Shocker.ProЕвгенийВВ обработчике клика поставьте Код: c# 1.
это перезапустит всю прогу что ли? нафиг это надо, мне всего лишь надо прекратить выполнение задачи. Нет, это перегрузит весь комп, прогу перезапустит Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 18:20 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
Ок, я получил ответ на свой вопрос. Я нарочно задал его в обобщенном виде, чтобы понимать, как в принципе поступают в таких случаях. В продолжение есть конкретный вопрос. На самом деле этим длинным методом является метод обращения к веб-сервису. Я никогда с ними не работал, попросили на коленке по-быстрому сделать скачку информации, я кинул в студию WSDL-файл, получил методы запустил-скачал. Но, так как методы работают заметное время и возникает блокировка интерфейсов, полез смотреть, как работать с многопоточностью, в результате чего и возник этот топик. Если же предполагаются, что методы .NET, связанные с обменом и могущие занимать много времени, работают с CancellationToken, то как мне быть в данном случае для создания возможности отмены выполнения WEB-метода? методы выполняются через экземпляр System.ServiceModel.ClientBase<>, который сгенерился автоматически. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 18:36 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 18:55 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
спасибо. Доберусь теперь уж только в понедельник. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 19:00 |
|
Task/asynс/await и прерывание синхронного метода
|
|||
---|---|---|---|
#18+
Shocker.Pro, авторметоды работают заметное время и возникает блокировка интерфейсов асинхронность ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2014, 19:07 |
|
|
start [/forum/topic.php?fid=20&fpage=115&tid=1402737]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
16ms |
get forum data: |
6ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 191ms |
0 / 0 |