2

これまでのところ、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 を解放しようとすると、破損やデータ損失が発生する可能性があります。」

4

1 に答える 1

3

明らかに、それはその特定のスレッドを中止する正しい方法ではありません、例外はあなたにそう告げます。このメッセージは、そのスレッドでCOMオブジェクトを使用していることを示しています。たぶんMicrosoftExcelのようなものですか?ワーカースレッドでCOMオブジェクトを実行するのは面倒で、非常に一般的に厳しいスレッド要件があります。その1つは、スレッドセーフではなく、「アパートスレッド」の親和性があることです。「オブジェクトに対するすべてのメソッド呼び出しは、とにかくUIスレッドで実行されます」という高価な言葉。これはそれを遅くし、スレッド化の利点を完全に打ち負かします。

とにかく、Reflectionを使用してスレッドを検索するのではなく、クラスのThreadフィールドを直接使用してください。そして、敷物を引っ張るのではなく、制御された方法でスレッドをシャットダウンするようにしてください。 このスレッドは例を示しています。

于 2010-04-24T18:46:35.300 に答える