為了更好地理解C#與C++的區別和解決問題方式的變化
我們先來看一個比較簡單的例子
我們將創建一個讀取文本文件的類
並在屏幕上顯示其內容
我將把它做成多線程程序
以便在從磁盤上讀取數據時還可以做其他的工作
在C++中
我們可能會創建一個讀文件的線程和另一個做其他工作的線程
這二個線程將各自獨立地運行
但可能會需要對它們進行同步
在C#中
我們也可以完成同樣的工作
由於
NET框架提供了功能強大的異步I/O機制
在編寫線程時
我們會節省不少的時間
異步I/O支持是內置在CLR中的
而且幾乎與使用正常的I/O流類一樣簡單
在程序的開始
我們首先通知編譯器
我們將在程序中使用許多名字空間中的對象
usingSystem;
usingSystem
IO;
usingSystem
Text;
在程序中包含System
並不會自動地包含其所有的子名字空間
必須使用using關健字明確地包含每個子名字空間
我們在例子中會用到I/O流類
因此需要包含System
IO名字空間
我們還需要System
Text名字空間支持字節流的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(this
OnCompletedRead);
}
From:http://tw.wingwit.com/Article/program/net/201311/15291.html