2010-04-24 2 views
2

지금까지 X 버튼을 클릭하면이 코드가 실행되었지만 종료 할 때 폼의 스레드를 종료하는 올바른 방법인지는 확실하지 않습니다.C# Abort() ing 스레드 종료시 폼

  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를 무료로 할 수 시도 활성 스레드 또는 다른 스레드에서 사용중인 부패 나 데이터 손실의 원인이됩니다. "

답변

3

예외적으로 특정 스레드를 중단하는 것이 올바른 방법은 아님이 분명합니다. 메시지는 해당 스레드에서 COM 개체를 사용하고 있음을 보여줍니다. 아마 Microsoft Excel과 같은 것일까요? 작업자 스레드에서 COM 개체를 실행하는 것은 번거롭고 엄격한 스레딩 요구 사항이 매우 일반적입니다. 그 중 하나는 스레드로부터 안전하지 않으며 "아파트 스레딩"친화력이 있다는 것입니다. "객체에 대한 모든 메서드 호출은 UI 스레드에서 어쨌든 실행됩니다"라는 비싼 단어입니다. 어느 것이 더 느려지 는가, 완전히 스레딩의 장점을 무너 뜨린다.

Anyhoo, 리플렉션을 사용하여 다시 스레드를 찾지 마십시오. 클래스의 스레드 필드를 직접 사용하십시오. 그리고 깔개를 당기지 말고 통제 된 방법으로 실을 막아야합니다. This thread에 예제가 나와 있습니다.

+0

나는 창이 항상 최소화되어있는 동안 항상 더 빠른 이유를 항상 궁금해했습니다. COM 객체는 플래시 게임이며 GUI 스레드에서 무한 루프를 실행할 때마다 게임이 멈추고 별도의 스레드에서 루프가 실행됩니다. –