我启动一个线程,使用 Application.Run (frm) 在其中打开一个表单
过了一会儿,主线程用 thread.Abort() 终止它问题是有时(很少,但仍然)发生
System.Threading.ThreadAbortException:线程被中止。
堆栈跟踪是不同的,但它们都包含控制绘图事件,显然是这种形式。如果我拦截这个额外线程的事件
Application.ThreadException += (s, e) => { };
那些。我会淹没它的错误(里面没有什么重要的东西,这是一个信息窗口),这个流中会有链接吗,它会保留在内存中吗?
例如,请考虑以下代码:
void runThread()
{
//запускаем поток
var t = new Thread(showForm);
t.Start();
//что-то делаем
Thread.Sleep(10000);
// грубо завершаем дочерний поток
t.Abort();
}
/// <summary>
/// ф-ция дочернего потока
/// </summary>
void showForm()
{
Application.ThreadException += (s, e) => { }; // достаточно ли этого чтобы тихо закрыть поток?
Application.Run(new myForm()); // на этой форме может происходить что угодно в плане отображения.
// данными не оперируем, только визульные фишечки. допустим, гифка крутится
}
不会有多余的链接,垃圾收集器会清理所有东西。除非您自己打开非托管资源。
但是,我不建议通过 Thread.Abort 来解决这个问题。更正确的做法是通过 Application.ExitThread 或关闭主窗体来停止额外的 UI 线程。
不幸的是,这两个操作只能在创建此表单的线程上完成。要向另一个线程发出关闭信号,最简单的方法是使用取消令牌(CancellationToken,.NET 4.0+)和同步上下文(SynchronizationContext)。
结果是这样的: