C # Abort () в потоках при выходе для формы - PullRequest
2 голосов
/ 24 апреля 2010

До сих пор этот код запускался при нажатии кнопки X, но я не уверен, является ли это правильным способом завершения потоков в форме при выходе.

           Type t = this.GetType();
           foreach (PropertyInfo pi in t.GetProperties())
           {
                if (pi.GetType() == typeof(Thread))
                {
                    MethodInfo mi = pi.GetType().GetMethod("Abort");
                    mi.Invoke(null, new object[] {});
                }   
            }

Я получаю эту ошибку: «Была предпринята попытка освободить используемый RCW. RCW используется в активном потоке или другом потоке. Попытка освободить используемый RCW может привести к повреждению или повреждению данных. потеря. "

1 Ответ

3 голосов
/ 24 апреля 2010

Очевидно, что это не правильный способ прервать этот конкретный поток, об этом говорит вам исключение. Сообщение показывает, что вы используете COM-объект в этом потоке. Может быть, что-то вроде Microsoft Excel? Запуск COM-объектов в рабочем потоке проблематичен, они очень часто предъявляют строгие требования к потокам. Одна из них заключается в том, что они не являются поточно-ориентированными и имеют сродство с квартирами. Дорогое слово «все ваши вызовы методов для объекта все равно будут выполняться в потоке пользовательского интерфейса». Что делает его медленнее, полностью уничтожая преимущества многопоточности.

Во всяком случае, не используйте Reflection, чтобы найти свои темы, используйте поле Thread в своем классе напрямую. И убедитесь, что вы закрыли нить контролируемым способом, а не тянули коврик. В этой теме показан пример.

...