.NET C#线程异常处理

5

我以为我理解了这个问题,但有点尴尬地要问一下,为什么以下代码中异常处理程序中的断点没有触发?该怎么解释呢?

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main()
    {
        Thread testThread = new Thread(new ParameterizedThreadStart(TestDownloadThread));
        testThread.IsBackground = true;
        testThread.Start();
    }

    static void TestDownloadThread(object parameters)
    {
        WebClient webClient = new WebClient();

        try
        {
            webClient.DownloadFile("foo", "bar");
        }
        catch (Exception e)
        {
            System.Console.WriteLine("Error downloading: " + e.Message);
        }
    }

我打字的时候,已经有4个新答案发布了! - Cheng Chen
5个回答

11
你正在创建一个线程,将其设置为后台线程,并启动它。然后你的“主”线程结束了。因为新线程是一个后台线程,它不会保持进程处于活动状态 - 所以在后台线程遇到任何问题之前,整个进程就会结束。
如果你编写如下代码:
testThread.Join();

如果在你的Main方法中,或者不将新线程设置为后台线程,那么应该会触发断点。


感谢您回答一个“愚蠢”的问题。 - Doo Dah

1

你的线程是一个后台线程(你自己设置的)。这意味着当应用程序完成时,线程将被关闭而没有被给予完成的机会。

因为你的 main 没有更多的内容,它立即退出,应用程序和你的线程都被终止。

如果你添加了一个 testThread.Join() 调用,那么你的线程将在应用程序退出之前完成,你会看到捕获的异常。


0
可能是因为主线程在工作线程结束之前就已经结束了。尝试添加


Console.ReadKey();

在你的Main方法的结尾处。


0

很可能你的后台线程在主线程退出之前没有启动 - 启动一个新线程可能需要一段时间。由于额外的线程是后台线程,所以当主线程退出时它会被终止。

为了演示目的,你可以让主方法等待 - 例如等待用户输入。这将允许后台线程开始运行。


0

由于新线程的IsBackground属性为true,它不会阻止进程终止。在Main()结束时,唯一的前台线程终止,关闭进程之前,其他线程还没有执行到那个地方。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接