我正在编写一些代码,它将在一个单独的线程上打开一个MessageBox,以防止MessageBox停止该程序。非常重要的是,启动一个新线程不会崩溃我正在运行的程序,但我不太了解线程以确保这种情况发生。
我的问题是,在启动线程后,如何在MessageBox关闭后安全地处理它?我想要关闭/处理它是必要的,因此它不仅仅是在创建和启动之后浮动。
请指教,谢谢!
var Thread = new Thread
(
()=>
{
MessageBox.Show("Buy pizza, Pay with snakes");
}
);
Thread.Start();
答案 0 :(得分:6)
您无需执行任何特殊操作。
当没有对它们的引用(在你的代码中)并且它们的主方法体已经终止时,线程实例被自动“清理”(而不是它们成为垃圾收集的候选者)。事实上,Thread
没有实现IDisposable
- 所以说它的“处置”是不正确的。
在您的示例中,一旦lambda方法完成(即消息框关闭),该线程将自动终止。你不需要做任何额外的事情。
现在回收已分配的内存与让对象成为处理/收集的候选对象之间存在差异。分配的任何对象都将保留在GC堆上,直到下一个集合清理它们为止......但您不必关心它。
您可能需要应对的另一个问题是在主UI线程以外的线程上执行UI操作。虽然有可能,但您必须注意不要引用在与您创建的线程不同的线程上创建的任何UI元素。
答案 1 :(得分:3)
在保留lambda表达式的范围后,线程将自动关闭...在您的情况下,您不必担心任何事情。
一般来说,将线程设置为后台也是一种很好的做法,因为如果您的应用程序已关闭,您可能会自己看到一个消息框:
var thread = new Thread(
()=>
{
MessageBox.Show("Buy pizza, pay with snakes");
});
thread.IsBackground = true;
thread.Start();
注意:您的变量最好以较低的字母开头。有关命名约定的详细信息,请参阅Microsoft Naming Guidelines。
答案 2 :(得分:2)
一旦包含在其中的代码完成,线程将自动清理它自己。您不必手动处理它(事实上,它不是IDisposable!)。
答案 3 :(得分:0)
首先要做的一些事情......
Join()
实例上的Thread
方法让程序等待线程执行结束。然后提出一个建议:您似乎需要无模式 MessageBox
。 AFAIK,这样做的可行方法是创建自定义表单并通过Show()
而不是ShowDialog()
显示。
答案 4 :(得分:0)
在C#中,一旦线程超出范围,你就不必非常关心它。这是一个简单的答案,但简单就是好:让计算机做它擅长的事情。: - )
答案 5 :(得分:0)
您应该知道,如果您的工作线程抛出异常并且没有被捕获,那么您的应用程序可能会中止(正如Humberto在第1点中提到的那样)。您提供的示例是微不足道的,我无法想象它会引发异常,但您可能想要考虑至少将工作线程逻辑包装在try / catch中。
我建议不要为此目的使用单独的线程。创建自己的表单以显示消息并使用Show方法显示它。创建这样的表单并不太难;我建议使用Button.DialogResult,Form.AcceptButton和Form.CancelButton属性。您可以更好地控制表单的外观
就可靠性而言,将代码保留在工作线程之外的一个优点是,您可以订阅Application.ThreadException事件,以便处理应用程序逻辑未捕获的任何异常。这样可以防止应用程序因未处理的异常而崩溃,但请注意这会影响整个应用程序。