(1)好象 子线程中的异常处理需要手动添加代码来捕获,否则看不到异常出现... ?(2)如果由主线程启动的子线程在执行时产生异常(子线程未添加异常处理代码),则该子线程是怎么结束的? (在测试中,如果不手动添加异常处理代码,即使明显会出现异常但就是不显示出来)(3)子线程如果处理不当,是否会引发安全问题或内存泄露等情况? 应当注意哪些情况?(4)如果程序中有一个用来记录错误的日志文件,假定该程序在运行时产生了三个子线程,且出现了三个子线程均在同一时刻产生异常(已添加异常处理代码)的情况,如果此时记录该错误,会导致三个线程同时向日志文件写记录,如何在并发写日志记录时不出错?(5)如果某主线程同时启动了三个功能类似的子线程,且三个子线程几乎在同一时刻完成各自的功能,但必须要有最后完成的一个子线程继续工作,即从它再启动三个子线程... 如此继续循环下去(直到满足某一特定的条件为止)     如何控制这种情况? 且不会出问题?(6)如果在Web上使用多线程,应该注意哪些问题? 
大家讨论一下,不晓得各位对多线程处理有什么好的看法?

解决方案 »

  1.   

    http://www.microsoft.com/china/MSDN/library/archives/library/dv_vstechart/html/vbtchasyncprocvb.asp
    看看 msdn 的讲解~
      

  2.   

    1、子线程出现异常当然会抛出异常,不知道你所说的看不到是什么意思?异常抛出后如果你不做处理应用程序应该会报错的。
    2、所有线程管理都是通过 Thread 类来完成的,包括由公共语言运行库创建的线程以及在运行库以外创建并进入托管环境以执行代码的线程。运行库监视其进程中曾经在托管执行环境中执行过代码的所有线程。每个线程都有自己的线程状态,线程的生命期与对象的生命期是一致的。你可以在代码中测试一下,主线程启动几个线程,跟踪一下每个线程的状态,以确定其生命周期
    3、如果是托管的多线程处理,不会发生内存泄漏的情况,非托管的多线程虽然.net的运行库会为此非托管线程创建一个Thread类,但不排除内部发生内存泄漏的情况。安全性是会很容易发生的,这也是多线程编程最困难的部分。
    4、作好同步就不会出现这样的情况了,怎么样做线程的同步有很多方法,比如互斥体、临界区、信号量等等方法都可以完成这样的工作
    5、最好的方法就是使用线程池了,呵呵,我可能不是很明白你的意思,不过你这样的线程处理不知道是为了什么,线程池可以绑你完成大部分工作同时避免很多问题出现
    6、web上的多线程,我认为需要注意的几个问题是:服务器资源,服务器资源必须尽快的释放掉;线程控制,由于在web与服务器的连接是短连接,线程启动后,启动线程的工作可能会结束,怎样去控制你的线程需要注意;全局变量,特别是对session、application的使用;另外建议如果能够使用异步处理尽量使用异步的处理
      

  3.   

    To:  herony420(坦荡荡)1、子线程出现异常当然会抛出异常不晓得为什么
      

  4.   

    不晓得为什么偶这里的子线程出现异常后,就是不提示错误...   出现异常的代码块在override方法体里...  该方法是在子线程里被实例化后再调用的
      

  5.   

    这应该是.net 框架的异常处理机制所决定的,请看看SDK上的描述:
    运行库使用基于异常对象和受保护代码块的异常处理模型。发生异常时,创建一个 Exception 对象来表示该异常。运行库为每个可执行文件创建一个异常信息表。在异常信息表中,可执行文件的每个方法都有一个关联的异常处理信息数组(可以为空)。数组中的每一项描述一个受保护的代码块、任何与该代码关联的异常筛选器和任何异常处理程序(Catch 语句)。此异常表非常有效,在没有发生异常时,在处理器时间或内存使用上没有性能损失。仅在异常发生时使用资源。异常信息表对于受保护的块有四种类型的异常处理程序: Finally 处理程序,它在每次块退出时都执行,不论退出是由正常控制流引起的还是由未处理的异常引起的。 
    错误处理程序,它在异常发生时必须执行,但在正常控制流完成时不执行。 
    类型筛选的处理程序,它处理指定类或该类的任何派生类的任何异常。 
    用户筛选的处理程序,它运行用户指定的代码,来确定异常应由关联的处理程序处理还是应传递给下一个受保护的块。 
    每种语言根据自己的规范实现这些异常处理程序。例如,Visual Basic .NET 通过 Catch 语句中的变量比较(使用 When 关键字)提供对用户筛选的处理程序的访问;C# 不实现用户筛选的处理程序。异常发生时,运行库开始执行由下列两步组成的过程: 运行库在数组中搜索满足下列条件的第一个受保护块: 
    保护包含当前执行的指令的区域,而且 
    包含异常处理程序或包含处理异常的筛选器。 
    如果出现匹配项,运行库创建一个 Exception 对象来描述该异常。然后运行库执行位于发生异常的语句与处理该异常的语句之间的所有 Finally 语句或错误处理语句。请注意,异常处理程序的顺序很重要:最里面的异常处理程序最先计算。还请注意,异常处理程序可以访问捕捉异常的例程的局部变量和本地内存,但引发异常时的任何中间值都会丢失。 
    如果当前方法中没有出现匹配项,则运行库搜索当前方法的每一个调用方,并沿着堆栈一直向上查找。如果任何调用方都没有匹配项,则运行库允许调试器访问该异常。如果调试器不能附加到该异常,则运行库引发 UnhandledException 事件。如果没有 UnhandledException 事件的侦听器,则运行库转储堆栈跟踪并结束程序。公共语言运行库捕捉 Catch 块没有捕捉的异常。根据运行库的配置,或者出现一个调试对话框,或者程序停止执行并出现一个包含异常信息的对话框。是否你的重载方法里可以看出是什么异常类呢,这个异常是你所希望的还是不希望的?