Я не уверен, что полностью понимаю твой вопрос, но я попробую. Кажется, вы пытаетесь решить две проблемы одновременно здесь.
Сначала вы пытаетесь передать параметры асинхронному потоку и / или отменить этот поток (очень похожие проблемы). Как уже говорили другие, BackgroundWorker уже обрабатывает отмену. Эта реализация похожа на передачу любого аргумента в ваш поток. Например, если бы я реплицировал эту функцию, я бы добавил свойство или метод Cancel в свой рабочий поток, который любой другой компонент мог бы вызвать, и проверил значение поддержки в цикле основного потока. Нет причин делать это для отмены потоков в эти дни, только пример передачи и использования значений в рабочий поток.
Другая проблема, которую, похоже, нужно решить, - это как отправлять сообщения между различными частями вашего приложения, которые в противном случае не должны ссылаться друг на друга. Как правило, я видел, как это делается с каким-либо поставщиком услуг. Реализуйте интерфейс в контексте или общей модели, к которой все компоненты получают экземпляр или имеют легкий доступ. Интерфейс должен содержать любые события, методы и свойства, чтобы различные компоненты могли взаимодействовать.
например. (возможно, плохой пример, но ...) Если моя процедура проверки грамматики должна отменяться при закрытии документа, я бы определил событие DocumentClosing и метод OnDocumentClosing в интерфейсе IDocumentService и реализовал этот интерфейс в соответствующем контексте / модели. При создании компонента компонента пользовательского интерфейса средства просмотра документов и компонента проверки грамматики я вставляю экземпляр контекста / модели, введенный в качестве интерфейса. Когда средство просмотра документов начинает закрывать документ, оно вызывает метод OnDocumentClosing из интерфейса. Когда поток создается, он присоединяется к событию DocumentClosing, и, если событие запускается, устанавливается флаг. Затем с интервалами при проверке грамматики я проверял флаг и отменял при необходимости.
Реализация такого рода дает вам гибкость, позволяющую любому компоненту инициировать соответствующие события, и любой другой компонент реагирует на них независимо от того, где в вашем приложении используются компоненты. Фактически этот подход полезен даже в синхронных ситуациях, таких как изменение состояния пунктов меню в ответ на события приложения. Это позволяет легко модульное тестирование всех ваших компонентов. А разделение ответственности означает, что вы можете легко изменять любые триггерные точки и ответы по мере необходимости.