我在这里和其他地方阅读了很多解决方案,但从来没有做对。我只是通过问这个问题而感到尴尬,但我在这里......
我的代码:
private void btnStart_Click(object sender, EventArgs e)
{
MyClass SomeData = new MyClass()
Thread ProcessThread = new Thread(c => StartService(SomeData));
ProcessThread.Start();
}
private void StartService(MyClass someData)
{
try
{
//System.Exception throws in this Execute method
someData.Execute();
}
catch(Exception Ex)
{
Show(Ex);
//Informing me some exception occurred.
}
}
当Excute方法抛出异常时(目前我故意将其投入测试),我不能abort
或end
线程并启动另一个来运行SAME方法。所以,基本上如果我想结束那个线程,然后再重新运行它。如果您认为重新运行存在风险,我会提出一个等待人工确认是否重新运行或结束它的问题。无论如何,我甚至无法结束它,并且线程在Thread ProcessThread = new Thread(c => StartService(SomeData));
行无效。
你能帮我吗?
答案 0 :(得分:2)
致电
Show(Ex);
似乎暗示了一个UI动作。如果这是真的,并且Show()没有正确封送该UI操作,则可能会抛出未处理的异常。
除了那个观察之外,你的线程应该在Show()退出后自己结束,因为之后线程的方法中没有更多的语句。您不必做任何事情(也不应该)手动结束线程。除了在相当不寻常的情况下,最好允许线程结束自己(有时通过向它们发送信号结束,或者在这种情况下,通过让方法运行完成)。
在你的catch
区块中,您当然可以启动一个新线程
Thread ProcessThread = new Thread(c => StartService(SomeData));
请注意,此ProcessThread
的范围与代码中的范围不同,因为它们都是在方法中定义的。如果您希望能够在整个类中访问该变量,可能会将其提升为类方法。
答案 1 :(得分:0)
Thread
完成后StartService
将自动退出。你不需要做任何事情来“结束”它。
如果您希望开始一个新线程,您可以直接在您的方法中执行此操作:
private void StartService(MyClass someData)
{
try
{
//System.Exception throws in this Execute method
someData.Execute();
}
catch(Exception Ex)
{
Show(Ex);
// "Restart" this thread
(new Thread(c => StartService(SomeData))).Start();
}
}
但是,您可能需要考虑使用某种逻辑来防止线程不断重启。一种选择是保持计数器重新启动的次数,如果重启次数超过两次,则在记录后正常退出。这样可以防止因不断抽出螺纹而立即引发的异常......