【问题标题】:Unhandled exception when Thread is aborted on a terminal server在终端服务器上中止线程时未处理的异常
【发布时间】:2014-12-29 18:12:32
【问题描述】:

在我们的程序中,启动画面在单独的线程中使用。当主线程完成一些工作时,它会中止启动线程。

代码如下:

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()

Trace 将其显示为 未处理的异常,但它使用了 catch。它提出了一个问题,如果它在终端服务器上运行与它有关。

终端服务器是否会创建一个特殊的上下文来以不同的方式处理线程?

【问题讨论】:

  • 您应该向您的启动屏幕线程发送一个信号以结束自身。如果没有必要,不要中止线程。
  • 您做错了:您应该有一个 applicationContext 并以表单形式打开启动画面,然后将其关闭。如果你中止一个线程,你会得到 threadabortexception
  • 如果很痛,不要这样做。 My very very very recent answer。如果线程运行一个,只需停止消息循环,在您的初始屏幕表单上调用Close,但您应该将调用编组到其所有者线程。您可以通过调用 Control.Invoke 来完成。

标签: c# multithreading


【解决方案1】:

似乎终端服务器上下文以不同方式处理此类异常(它可能具有用于检测任何类型异常的敏感设置)。

最终,我消除了线程中止并使用了基于事件的方法。它现在可以在本地机器和终端服务器上运行。

【讨论】:

    猜你喜欢
    • 2016-09-21
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多