Я рекомендую использовать класс Task
(добавлен в .NET 4.0), если вам нужно такое поведение. Он поддерживает Cancellation , и вы можете иметь любое количество задач, прослушивая один и тот же токен отмены, что позволяет отменить их все одним вызовом метода.
Обновлено (решение не для версии 4.0):
У вас действительно есть только два варианта. Первый: реализовать собственный демультиплексор событий (это намного сложнее, чем кажется из-за ограничения ожидания из 64 дескрипторов); Я не могу рекомендовать это - я должен был сделать это один раз (в неуправляемом коде), и это было отвратительно.
Это оставляет второй выбор: есть сигнал отменить задания. Естественно, RegisteredWaitHandle.Unregister
может отменить часть RWFSO. QUWI является более сложным, но его можно сделать, уведомив действие о значении «токен». Когда действие выполняется, оно сначала сравнивает значение токена с его сохраненным значением токена; если они разные, то это ничего не должно делать.
Одна важная вещь, которую следует учитывать, это условия гонки. Просто имейте в виду, что между отменой действия и выполнением ThreadPool существует условие гонки, поэтому можно увидеть действия, выполняющиеся после отмены.
У меня есть сообщение в блоге об этой концепции , которое я называю "контекстами асинхронного обратного вызова". Тип CallbackContext
, упомянутый в сообщении в блоге, доступен в библиотеке Nito.Async .