Могу ли я отменить методы через делегатов в C # - PullRequest
6 голосов
/ 11 сентября 2009

Я бы хотел немедленно остановить метод, если я нажму «Отмена» на экране анимации «Обработка». Я использую асинхронный вызов через делегатов. Можно ли немедленно остановить выполнение метода через делегатов?

Спасибо:)

Ответы [ 3 ]

9 голосов
/ 11 сентября 2009

Нет - по крайней мере, не чисто. (Я не включаю Thread.Abort как «чистый».) Что вам нужно сделать, так это иметь механизм, чтобы сообщить делегату, что вы пытаетесь отменить его. Тогда вашему делегату потребуется периодически проверять этот флаг отмены и реагировать соответствующим образом.

Параллельные расширения имеют встроенную отмену повсеместно (и, в частности, токены отмены, позволяющие только соответствующим частям кода отменять задачу). Это все еще кооператив, хотя, насколько я знаю. Принудительная отмена всегда может привести к повреждению состояния.

5 голосов
/ 11 сентября 2009

Вы можете использовать System.ComponentModel.BackgroundWorker . Он поддерживает отмену, так что вам не нужно писать шаблонный код. Код клиента может просто вызывать метод CancelAsyn , и вы можете проверить свойство CancellationPending в своем коде, когда и где имеет смысл определить, отменил ли клиент операцию и выручил.

1 голос
/ 11 сентября 2009

Как уже сказал Джон, вы не можете сказать потоку: «пожалуйста, остановитесь сейчас» и ожидайте, что поток будет подчиняться. Thread.Abort не скажет ему остановиться, просто отключит его. :)

В прошлом я делал добавление серии «if (wehavetostop)» в коде потока, а если пользователь нажал «отменить», я поместил wehavetostop == true.

Это не слишком элегантно, и в некоторых случаях может быть «трудно» поставить проверки «если», особенно если ваш поток выполняет «длинную» операцию, которую вы не можете разделить.

Если вы пытаетесь установить сетевое соединение (и это занимает много времени), и вы действительно думаете, что «ненормальное» завершение потока не приведет к повреждению, вы можете использовать его, но помните, что вы не можете доверять состояние вещей, которые были вовлечены в эту тему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...