发生异常时如何结束线程?

时间:2013-01-28 20:20:28

标签: .net multithreading exception-handling

我在这里和其他地方阅读了很多解决方案,但从来没有做对。我只是通过问这个问题而感到尴尬,但我在这里......

我的代码:

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方法抛出异常时(目前我故意将其投入测试),我不能abortend线程并启动另一个来运行SAME方法。所以,基本上如果我想结束那个线程,然后再重新运行它。如果您认为重新运行存在风险,我会提出一个等待人工确认是否重新运行或结束它的问题。无论如何,我甚至无法结束它,并且线程在Thread ProcessThread = new Thread(c => StartService(SomeData));行无效。

你能帮我吗?

2 个答案:

答案 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();
        }
    }

但是,您可能需要考虑使用某种逻辑来防止线程不断重启。一种选择是保持计数器重新启动的次数,如果重启次数超过两次,则在记录后正常退出。这样可以防止因不断抽出螺纹而立即引发的异常......