为了更好地理解C#与C++的区别和解决问题方式的变化我们先来看一个比较简单的例子我们将创建一个读取文本文件的类并在屏幕上显示其内容我将把它做成多线程程序以便在从磁盘上读取数据时还可以做其他的工作 在C++中我们可能会创建一个读文件的线程和另一个做其他工作的线程这二个线程将各自独立地运行但可能会需要对它们进行同步在C#中我们也可以完成同样的工作由于NET框架提供了功能强大的异步I/O机制在编写线程时我们会节省不少的时间 异步I/O支持是内置在CLR中的而且几乎与使用正常的I/O流类一样简单在程序的开始我们首先通知编译器我们将在程序中使用许多名字空间中的对象 usingSystem; usingSystemIO; usingSystemText; 在程序中包含System并不会自动地包含其所有的子名字空间必须使用using关健字明确地包含每个子名字空间我们在例子中会用到I/O流类因此需要包含SystemIO名字空间我们还需要SystemText名字空间支持字节流的ASCII编码 由于NET架构为完成了大部分的工作编写这一程序所需的步骤相当简单我们将用到Stream类的BeginRead方法它提供异步I/O功能将数据读入到一个缓沖区中当缓沖区可以处理时调用相应的处理程序 我们需要使用一个字节数组作为缓沖区和回叫方法的代理并将这二者定义为驱动程序类的private成员变量 publicclassAsynchIOTester { privateStreaminputStream; privatebyte[]buffer; privateAsyncCallbackmyCallBack; inputStream是一个Stream类型的变量我们将对它调用BeginRead方法代理与成员函数的指针非常相似代理是C#的第一类元素 当缓沖区被磁盘上的文件填满时NET将调用被代理的方法对数据进行处理在等待读取数据期间我们可以让计算机完成其他的工作(在本例中是将个整型变量由增加到但在实际的应用程序中我们可以让计算机与用户进行交互或作其他有意义的工作) 本例中的代理被定义为AsyncCallback类型的过程这是Stream的BeginRead方法所需要的System空间中AsyncCallback类型代理的定义如下所示 publicdelegatevoidAsyncCallback(IAsyncResultar); 这一代理可以是与任何返回void类型值将IAsyncResult界面作为参数的方法相关联的在该方法被调用时CLR可以在运行时传递IAsyncResult界面对象作为参数我们需要如下所示的形式定义该方法 voidOnCompletedRead(IAsyncResultasyncResult) 然后在构造器中与代理连接起来 AsynchIOTester() { ??? myCallBack=newAsyncCallback(thisOnCompletedRead); } |