因为工作中需要在多线程中使用事件,本来想在事件中抛出一个异常到主程序中,结果可想而知,失败了。于是作了如下的一个测试,看看多线程中的异常处理问题,代码如下:

using System; 
 using System.Runtime.InteropServices; 
 using System.Threading; 
  
 namespace testAsyncEvent 
 { 
     /** <summary> 
     /// Class1 的摘要说明。 
     /// </summary> 
     class Class1 
     { 
         /** <summary> 
         /// 应用程序的主入口点。 
         /// </summary> 
         [STAThread] 
         static void Main(string[] args) 
         { 
             Class1 c = new Class1(); 
             Thread t = new Thread(new ThreadStart(c.Run)); 
              = "root"; 
             t.Start(); 
         } 
  
         public void Run() 
         { 
             EventRaiser er0 = new EventRaiser("er0"); 
             er0.AsyncTextChanged += new TextEvent(er0_TextChanged); 
             er0.SyncTextChanged += new TextEvent(er0_TextChanged); 
  
             Console.Out.WriteLine("Begin"); 
             ThreadStart ts = new ThreadStart(er0.Run); 
             Thread thr = new Thread(ts); 
              = "child"; 
             thr.Start(); 
             Console.Out.WriteLine("Thread Started"); 
  
             for(int i = 0; i < 10; ++i) 
             { 
                 Thread.Sleep(20); 
                 Console.Out.WriteLine( + ": Cycle Print"); 
             } 
  
             if( thr.IsAlive ) 
                 thr.Join(); 
                  
             Console.Out.WriteLine("Ok"); 
             Console.Out.WriteLine("Press Enter to Exit "); 
             Console.In.ReadLine(); 
         } 
  
         private void er0_TextChanged(string id, string text) 
         { 
             Console.Out.WriteLine( + "(" + id + "):\t" + text); 
         } 
     } 
  
  
     public delegate void TextEvent(string id, string text); 
  
     class EventRaiser 
     { 
         const int CYCLES = 3; 
         public event TextEvent AsyncTextChanged; 
         public event TextEvent SyncTextChanged; 
  
         string _id; 
         private int count = 0; 
  
         public EventRaiser(string id) 
         { 
             _id = id; 
         } 
  
         public void Run() 
         { 
             RaiseText("Enter Thread:" + ); 
             for(int i = 0; i < CYCLES; ++i) 
             { 
                 Thread.Sleep(10); 
                 RaiseEvent(); 
             } 
  
             for(int i = 0; i < CYCLES; ++i) 
             { 
                 RaiseEvent(); 
             } 
  
             for(int i = 0; i < CYCLES; ++i) 
             { 
                 Thread.Sleep(10); 
                 RaiseEvent(); 
             } 
             RaiseText("Exit Thread:" + ); 
         } 
  
         void RaiseText(string text) 
         { 
             AsyncTextChanged.BeginInvoke(_id, text, null, null); 
             SyncTextChanged(_id, text); 
         } 
  
         void RaiseEvent() 
         { 
             RaiseText(count++.ToString()); 
         } 
     } 
  
 }


 

代码的执行结果如下: 
Begin 
Thread Started 
root: Cycle Print 
child(er0):     Enter Thread:child 
(er0):  Enter Thread:child 
root: Cycle Print 
child(er0):     0 
(er0):  0 
(er0):  1 
child(er0):     1 
root: Cycle Print 
(er0):  2 
child(er0):     2 
(er0):  3 
child(er0):     3 
(er0):  4 
child(er0):     4 
(er0):  5 
child(er0):     5 
(er0):  6 
child(er0):     6 
root: Cycle Print 
(er0):  7 
child(er0):     7 
(er0):  8 
child(er0):     8 
(er0):  Exit Thread:child 
child(er0):     Exit Thread:child 
root: Cycle Print 
root: Cycle Print 
root: Cycle Print 
root: Cycle Print 
root: Cycle Print 
root: Cycle Print alerter -错误警报器,垃圾 

application layer gateway service -给与第三者网络共享/防火墙支持的服务,有些防火墙/网络共享软件需要。占用 1。5mb内存。 

application management-用于设定,发布和删除软件服务。 

automatic updates -windows自动更新,靠,滚! 

background intelligent transfer service -这个服务原是用来实现http1.1服务器之间的信息传输,微软称支持windows更新时断点续传 

clipbook - 用与局域网电脑来共享 粘贴/剪贴的内容。(靠,想得出!) 

com+Event system -一些 COM+ 软件需要,检查你的 c:\program files\ComPlus Applications 目录,没东西可以把这个服务关闭. 

COM+Event system application -同上 

COmputer browser - 用来浏览局域网电脑的服务,但关了也不影响浏览!垃圾 

cryptographic services -windows更新时用来确认windows 文件指纹的,我更新时才开启一下。 

DHCP client-静态IP者需要(xDSL 等)小猫就不用了!! 

Distributed link tracking client-用于局域网更新连接信息,比如在电脑A有个文件,在B做了个连接,如果文件移动了,这个服务将会 

更新信息。占用4兆内存。 

Distributed Transaction coordinator-无聊的东西。 

DNS Client-DNS解析服务。。无聊~~ 

Error reporting service -错误报告器,把windows中错误报告给微软,无聊~~~~~ 

*Event Log - 系统日志纪录服务,很有用于查找系统毛病. 

Fast user switching compatibility-多用户快速切换服务..无聊 

help and support -帮助,无聊,还是无聊帮助..哈哈 

Human interface device access-支持"弱智“电脑配件的。。比如键盘上调音量的按钮等等。。 

IMAPI CD-burning COM service -xp刻牒服务,用软件就不用了,占用1。6兆内存。 

Indexing service -恐怖的xp减速的东东!!!关关关!!! 

Internet Connection Firewall(ICF).........-xp防火墙。。不用就关。 

IPSEC Services-大众用户连边都沾不上。 

Logical Disk manager -磁盘管理服务。。需要时它会通知你,所以一般关。 

Logical Disk manager administrative service-同上。 

messenger -不是msn,不想被骚扰的话就关。注:妖刺就是利用这个。 

MS software shadow copy provider-无用,据说是备份用的。。我看什么用都没。 

Net Logon-登陆 Domain Controller 用的,大众用户快关! 

Netmeeting remote desktop sharing-用netmeeting 实现电脑共享。。晕!关!! 

Network Connections - 上网/局域网要用的东东! 

Network DDE -和clipbook一起用的,无聊~~~~ 

Network DDE DSDM -同上 

Network Location Awareness-如有网络共享或ICS/ICF可能需要.(服务器端) 

NT LM Security support provider-telnet 服务用的东东,关!! 

NVIDIA Driver Helper service -nvidia 显卡帮助,关! 

PDEngine - perfectdisk 引擎 

PDScheduler -perfectdisk 计划服务 

PerFORMance logs and alerts-记录机器运行状况而且定时写入日志或发警告,内容可能过于专业,所以。。自己决定。 

*Plug and Play - 自动查测新装硬件,即插即用,开着吧~~~ 

Portable media serial number-绝对无用,无聊之及。 

Print Spooler -打印机用的,我打印时才开一下。 

Protected Storage-储存本地密码和网上服务密码的服务,包括填表时的“自动完成”功能。 

QoS RSVP -关!就是那个20%的 QoS 

Remote access auto connection manager-宽带者/网络共享可能需要!! 

Remote desktop help session manager-远程帮助服务,傻透,占用4兆内存。 

*Remote Procedure Call (RPC) -系统核心服务! 

Remote Procedure Call LOCATOR-这个倒没什么用,管理 RPC 数据库服务,占用1兆内存。 

remote registry -远程注册表运行/修改。大漏洞,还不快关!! 

removable storage -一般情况下不用,磁带备份用的。 

routing and remote access-哈哈。。不知者关! 

secondary logon-给与administrator 以外的用户分配指定操作权.晕~~~ 

security accounts manager-像 Protected Storage, IIS Admin 才需要。 

server -局域网文件/打印共享需要的。 

shell hardware detection-给有些配置自动启动,像内存棒,和有些cd驱动等 

smart card -关!1。4兆内存 

smart card helper -关! 

SSDP Discovery service-没有什么硬件利用这个服务。。 

system event notification-记录用户登录/注销/重起/关机信息。。谁管这些。。 

system restore service -系统还原服务,吃资源和内存的怪兽。。虽然有时用到,自己决定。 

task scheduler-windows 计划服务啦,垃圾. 

TCP/IP NetBIOS helper-如果你的网络不用 Netbios 或WINS,关了. 

Telephony - 拨号服务,如果你的宽带不用拨号,那么关了它。 

telnet -大漏洞,我第一个关的就是这个.这根dos中 telnet 命令没关系。2兆内存。 

terminal services-实现远程登录本地电脑,快速用户切换和远程桌面功能需要,不用这些功能就关了吧。 

themes -给xp打扮的东东,不要太花锹的就关了。 

uninterruptible power supply-停电保护设备用的。。。没有的就关。 

universal plug and play device host-同SSDP Discovery Service ,没用. 

upload manager-用来实现服务器和客户端输送文件的服务,简单文件传输不需要这个! 

volume shadow copy-同MS Software Shadow Copy Provider,无用. 

webclient-可能和以后的.net技术有联系,安全起见,我关得实实的! 

*Windows Audio - 控制着你听到的声音。关了就没声音了!! 

Windows Installer -windows的MSI安装服务,建议设成手动。 

windows image acquisition (WIA) -有些数码相机和扫描器用的,我的扫描器觉得它没用。 

*Windows Management Instrumentation - 满重要的服务,是管"服务依靠"的,但关了会出现奇怪的问题. 

windows management instrumentation driver extensions-没上面的重要,建议设成手动. 

windows time -网上时间校对..晕 

wireless zero configuration -无线网络设置服务..很少人用吧... 

WMI perFORMance adapter -关!占用6兆内存. 

*Workstation -很多服务都依靠这个服务,支持联网和打印/文件共享的.

Ok 
Press Enter to Exit ... 

从结果分析,发现如果在线程中发生同步事件,则事件的发生源在同一个线程中,如果线程中发生异步事件,则该事件既不在主线程中,也不再子线程中,而是在系统的临时线程中。 

但是这里有一个问题,我无法区分线程的真正不同,哪里可以取得线程号阿?谁能告诉我,这样有线程号的区别,这个例子可以更清楚一些。