Я согласен с ответом Пола Александра в том, что вы должны никогда звонить Thread.Abort
, это ужасный способ справиться с синхронизацией.
Кроме того, у вас здесь ужасное разделение интересов. Потоки не должны обращаться к ресурсам в форме напрямую. Между ними должна быть какая-то абстракция / разделяемое состояние, которое изменяется и читается обеими сторонами (потоком и формой, поэтому убедитесь, что экземпляр является потокобезопасным).
Тем не менее, если вы не можете внести эти изменения, тогда в методе Close вызовите методы Thread.Abort
в другом потоке с оператором try / catch вокруг каждого. Зарегистрируйте ошибки где-нибудь хотя бы.
Выполняя вызовы Thread.Abort
в другом потоке, вы не блокируете поток пользовательского интерфейса, поскольку не гарантируется, что вызовы Thread.Abort
будут мгновенными, а блокировка потока пользовательского интерфейса вызовет серый цвет X в то время как поток пользовательского интерфейса не может обрабатывать сообщения Windows (это также поможет вам лучше разделить проблемы).
Однако вам следует перейти к абстрагированию ресурсов, которые распределяются между формой и потоком, а также предоставить надлежащий механизм отмены.
Если вы абстрагируете ресурсы для класса, который разделяет состояние, то ваша форма не должна ничего делать при закрытии, стеки вызовов потока имеют ссылку на объект, который имеет состояние, и вы можете затем вызвать abort в этих потоках, не беспокоясь о форме и потоках, разделяющих что-либо.
Оттуда вы можете ввести надлежащий механизм совместного отмены ( совместное отмену, которое Task поддерживает в .NET 4.0 , если он вам доступен).