2014-12-19 1 views
-1

이 프로그램에서 시작 화면은 별도 스레드에서 사용됩니다. 주 스레드가 일부 작업을 완료하면 스플래시 스레드를 중단합니다. 로컬 또는 네트워크 컴퓨터에서 사용스레드가 터미널 서버에서 중단 될 때 처리되지 않은 예외

if (thread != null && thread.IsAlive) 
    { 
    try 
    { 
     thread.Abort(); 
    } 
    catch (ThreadAbortException) 
    { 
     Debug.WriteLine("Splash thread aborted"); 
    } 
    } 

, 그것은 잘 작동 : 여기

는 코드입니다.

System.Threading.ThreadAbortException, mscorlib에, 버전 = 2.0.0.0, 문화 = 중립, PublicKeyToken = b77a5c561934e089

가하십시오 터미널 서버에 사용하는 경우

, 우리는이 예외가 작업이 중단되었다.

스택 추적 :

System.ServiceModel.Diagnostics.DiagnosticTrace.UnhandledExceptionHandler(Object sender, UnhandledExceptionEventArgs args) 
MS.Win32.UnsafeNativeMethods.ITfMessagePump.GetMessageW(MSG& msg, Int32 hwnd, Int32 msgFilterMin, Int32 msgFilterMax, Boolean& result) 
System.Windows.Threading.Dispatcher.GetMessage(MSG& msg, IntPtr hwnd, Int32 minMessage, Int32 maxMessage) 
System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
System.Windows.Window.ShowHelper(Object booleanBox) 
System.Windows.Window.Show() 
System.Windows.Window.ShowDialog() 
OurApplication.App.<>c__DisplayClass8.<Application_Startup>b__0() 
System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
System.Threading.ThreadHelper.ThreadStart() 

추적은 처리되지 않은 예외으로 이것을 보여줍니다, 그러나 그것은 캐치를 사용합니다. 터미널 서버에서 실행되는 것과 관련이 있다면 문제가 제기됩니다.

터미널 서버가 스레드를 다르게 처리하는 특수 컨텍스트를 만들었습니까?

+7

스플래시 화면 스레드로 신호를 보내 자신을 종료해야합니다. 할 필요가 없다면 쓰레드를 중단하지 마라. – nvoigt

+0

당신은 잘못하고 있습니다 : 당신은 applicationContext가 있어야하고 폼으로 시작을 연 다음 닫아야합니다. 스레드를 중단하면 threadabortexception이 발생합니다. – giammin

+2

아파하는 경우 실행하지 마십시오. [내 아주 아주 최근의 답변] (http://stackoverflow.com/questions/27561976/check-if-thread-finished-its-method-before-killing-it-c-sharp/27562048#27562048). 스레드가 하나를 실행하면 메시지 루프를 멈추고 스플래시 화면 양식에서'Close '를 호출하지만 호출을 소유자 스레드로 마샬링해야합니다. 'Control.Invoke'를 호출하면됩니다. –

답변

0

터미널 서버 컨텍스트가이 유형의 예외를 다르게 처리합니다 (모든 유형의 예외를 감지하기위한 중요한 설정이있을 수 있음).

결국 스레드 중단을 제거하고 이벤트 기반 접근 을 사용했습니다. 이제 로컬 시스템과 종료 서버에서도 작동합니다.