我写了一个多线程下载程序,
Thread t = new Thread(() =>
{
  //功能处理
try
{
}
catch (Exception ex)
                        {
                            //这里处理异常
                        }我照上面的方法捕获了异常但是程序还是崩溃了。子线程运行中出现异常应该如何处理可以防止程序崩溃。

解决方案 »

  1.   

    Thread t = new Thread((ThreadStart)delegate          
    {               
    try               
    {   
     new System.Net.WebClient().DownloadFile(url, filepath);//下载文件                
     throw new Exception("多线程异常");               
    }               
    catch (Exception error)              
    {                    
    MessageBox.Show("工作线程异常:" + error.Message + Environment.NewLine + error.StackTrace);                
    }           
    });            
    t.Start();
      

  2.   

    你子线程中做了什么?导致程序集崩溃的话,你是否用了com?要设置Thread为STA。等你更详细的描述再看。
      

  3.   

    我在子线程中就是使用了HttpWebRequest类和HttpWebResponse类进行多线程下载。
    有的时候下载链接或者保存地址出错了就会导致程序崩溃。
      

  4.   

    是否在子线线程中操作主线程中创建的控件了?如果是的话,要用控件的invoke方法,因为在windows中,是不支持跨线程操作windows控件的
      

  5.   

    不知道你在catch中写了什么。退一万步说,你可以在AppDomain.CurrentDomain.UnhandledException事件中捕获程序退出时的Exception,并记录日志。
      

  6.   

    可以在处理这个事件时写一句:Debug.Print("{0}发生系统异常:{1}", DateTime.Now, e.ExceptionObject.ToString());然后在vs的output窗口中去看引起程序崩溃的堆栈信息、代码行。
      

  7.   

    Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
                AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
            {
                      }        void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
            {
               
            }
    看看异常
      

  8.   

    如果在功能处理部分中出现非线程保护操作,于是连调试程序都过不去,在vs2010我就遇到过类似情况,程序直接退出。这时使用try处理异常根本不生效,线程不会走到异常处理。
      

  9.   

    你没有说引起崩溃的代码在哪里,那就是让人猜bug呢。这怎么知道你所写的try...catch...管不管用呢?写个几行的demo,复现一下这个崩溃出来。
      

  10.   


    Thread t = new Thread(
    () =>
    {
      //功能代码
      Thread t1 = new Thread(
      () =>
      {
        //功能代码
         try
         {
           //出现异常
         }
         catch{//抛出异常}
        t1.Start();
      });
      //如何在t中获取t1抛出的异常?
    });
    t.Start();
      

  11.   

    use visual studio multithread debug feature
    debug -> window -> thread
      

  12.   

    use visual studio multithread debug feature
    debug -> window -> thread
      

  13.   

    比如线程t只要5毫秒就执行完了(不过是启动t1嘛),而t1需要执行5分钟,一个执行5毫秒就结束了的东西怎么可能捕获5分钟之后、自己已经结束了生命期并且被.net回收了之后别的不相干程序抛出的异常?至少.net没有这样的机制。如果这样设计,我想我就不会用.net。
      

  14.   

    t所执行的代码,只不过是创建一个t1,执行其.start()代码。只要这个没有异常,那么t就结束了。我想你可能是对函数调用的思维框框刻得比较深,而少了面向对象(或者是面向数据实体)的思维方式。t不过是创建了一个对象注册给系统,然后调用了它的Start方法。它不负责等待这个Start方法执行完,它自己立刻就结束了。
      

  15.   

    而且,在t中的方法调用t1的.Start方法时,t1这个线程所需要调用的方法也未必现在就开始执行,只是告诉系统可以开始调用t1的方法而已。t线程中的程序执行完,它的局部变量t1也没用了。尽管此时t1线程还存在(甚至其要执行的方法还没有开始执行),但是t1这个变量已经没用了,只不过原来t1所引用的线程对象还在。所以你的代码中,t跟t1没有什么嵌套执行关系,没有什么谁包括谁的关系。
      

  16.   

    t1抛出异常,它的上一级程序就是你的应用系统了。怎么会是t呢?t只是负责向系统注册一个t1线程对象,然后告诉系统可以以后去调度这个线程了,然后它的代码就结束了。怎么可能在t中捕获t1的异常?
      

  17.   

    按你的写了测试例子,没报错。
    static void Main(string[] args)
    {
        Thread t = new Thread(() =>
        {
            //功能代码
            Thread t1 = null;
            t1 = new Thread(
            () =>
            {
                //功能代码
                try
                {
                    //出现异常
                    throw new Exception("test");
                }
                catch
                {
                    //抛出异常}
                    t1.Start();
                }
            });
            //如何在t中获取t1抛出的异常?
        });
        t.Start();    Console.ReadKey();
    }
      

  18.   

    呵呵,t1的“catch{//抛出异常}”没有抛出异常。
      

  19.   

    这代码是有问题的,try
                {
                    //出现异常
                    throw new Exception("test");
                }
    根本就没有执行到。
    你不信调试下。
    你没有Start不会执行t1 = new Thread(() => {});里面的代码。
      

  20.   

    都仔细琢磨sp1234的回复吧,把“//出现异常”那段代码晒出来。我的意见没有必要不要使用线程,微软也是这样建议的。一般情况是站有大量运算时,占用cpu时间过长,影响用户响应时才使用到线程。
      

  21.   

    ls说的对,最好线程中自己处理异常。[STAThread]
    static void Main(string[] args)
    {
        Thread t = new Thread(() =>
        {
            //功能代码
            Thread t1 = null;
            t1 = new Thread(() =>
            {
                MessageBox.Show("Begin thread!");
                //功能代码
                try
                {
                    //出现异常
                    throw new Exception("test");
                }
                catch
                {
                    //抛出异常}
                    throw;
                    t1.Start();
                }
            });
            //如何在t中获取t1抛出的异常?
            t1.Start();
        });
        t.Start();
        Application.ThreadException += (s, e) =>
            {
                MessageBox.Show(e.Exception.Message);
            };
        AppDomain.CurrentDomain.UnhandledException += (s, e) =>
        {
            MessageBox.Show(e.ExceptionObject.ToString());
        };
        Console.ReadKey();
    }
    可以拦截到,但是依然会退出的,楼上说的很对,自己线程中处理好。不要让别的线程给自己擦屁股。