【发布时间】: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