
图2. 在使用.NET Framewok中用到的跟踪工具
类是System.Diagnostics名称空间的一部分。Trace类提供了几个共享的方法。例如,Write方法允许你记录特定消息,而Assert方法允许你在特定的条件为假的情况下记录一条消息。Trace类将消息输出到Listeners集合中的对象。这个集合中的每个对象都属于继承自TraceListener的一个类。EventLogTraceListener 将消息写入事件记录,而TextWriterTraceListener则是将消息写入到一个文本文件中,默认情况下,DefaultTraceListener的一个实例被添加到Trace类的Listeners集合中。
除了标准的监听程序以外,你可以实施自己跟踪监听程序。例如,你希望接收来自在防火墙后面的远程机器上运行的应用程序的跟踪输出。你可以编写一个跟踪监听程序,通过HTTP全球向你的服务器发送跟踪消息。这将会影响你的应用程序的性能,但只会在启用跟踪时才会对性能有所影响。
代表性地,你需要有能力在编译的二进制文件中包括或去除跟踪代码。为了在Visual Basic 6.0中做到这一点,你需要使用编译常量,并在#If语句中包含所有的跟踪代码,这使得代码很难理解和维护。利用.NET Framework,你只需在项目属性(Project Properties)对话框中将TRACE编译常量设为on或off状态;你无需在#If语句中包括跟踪代码。
另一个普遍期望的跟踪特性是跟踪水平设置,这包括不同的跟踪设置-例如, Severe(严重)、Error(错误)、Warning(警告)和Information(信息)-这些设置对记录哪些信息进行控制。你可以使用跟踪组件启动时所读取的注册表数值对此进行控制。对于.NET Framework,这是完全内置的功能。你可以设置一个注册表数值来控制你当前的应用程序的记录水平,比如,只有在跟踪水平被设置为Severe(严重)的情况下,才使用Trace.WriteIf和Trace.WriteLineIf来记录消息。
集成的跟踪和记录特性极大地增强了生产力,因为你只需使用内置的特性,将精力集中在编写真正的应用程序代码上。
.NET Framework的一个很重要的特性是,可以在不使用第三方工具或不支持的Visual Basic技巧情况下,使用Visual Basic创建多线程应用程序。.NET Framework的多线程支持是由System.Threading名称空间中的类和接口提供的,因此所有的.NET语言都能够以相同的方式创建和处理线程。System.Threading.Thread是一个核心类,提供了对创建和控制线程的支持。要创建一个线程,你可以创建一个新的System.Threading.Thread对象,将构造函数传递给ThreadStart代理。这个代理提供了这个线程开始执行的方法。当你准备启动这个新的线程时,可以调用Thread.Start() (请参阅清单1)。
当你开始创建多线程应用程序时,你很快就会认识到需要控制对共享资源的访问,如共享的类变量。.NET Framework还包括几个类和数据类型,你可以使用它们对两个线程执行的动作进行同步。
在最简单的情况中,你由一个需要从不同的线程中进行更新的共享变量。要这样做,你可以使用System.Threading.Interlocked类。例如,你可以通过编写Interlocked.Increment(num)或Interlocked.Decrement(num)分别使名为num的共享变量递增或递减。你还可以使用Interlocked将变量设为某一特定值,或检查两个变量是否相等。除了这种简单情况以外,你可以使用.NET Framework类来执行更复杂的线程同步,如事件和互斥体的同步-所有都来自于.NET Framework内部,而无须使用Win32 API。.
清单1. 使用Visual Basic .NET创建线程
你创建了一个新线程,将它传递给一个ThreadStart代理。然后调用Thread.Start()启动这个线程。你可以通过调用Thread.Stop()来中止这个线程,然后调用Thread.Join()等待它完成关闭操作。一个线程可以使用System.Threading.Interlocked来使变量递增或递减。
此外,.NET Framework提供了一个方便的机制来对工作排队,并将起分配给线程池中的某个线程。在处理多个并发工作项目或工作请求的服务器应用程序中,这非常有用。例如,对于等待输入文件,然后将它们导入到数据库中去的应用程序,可能会对每个输入文件进行排队,以在线程池中的某个单独的线程上进行处理。System.Threading.ThreadPool类允许你使用共享的QueueUserWorkItem方法对工作进行排队。以前要这样做,你必须得创建和管理自己的线程池。你又需要在基础设施工作而不是在解决商务问题上花大量的时间和精力。