异步读写数据流
一、異步讀取數據
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Threading;namespace UseBeginRead {class Program{//定義異步讀取狀態類class AsyncState{public FileStream FS { get; set; }public byte[] Buffer { get; set; }public ManualResetEvent EvtHandle { get; set; }}static int bufferSize = 512;static void Main(string[] args){string filePath = "d:\\test.txt";//以只讀方式打開文件流using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)){var buffer = new byte[bufferSize];//構造BeginRead需要傳遞的狀態var asyncState = new AsyncState { FS = fileStream, Buffer = buffer ,EvtHandle = new ManualResetEvent(false)};//異步讀取IAsyncResult asyncResult = fileStream.BeginRead(buffer, 0, bufferSize, new AsyncCallback(AsyncReadCallback), asyncState);//阻塞當前線程直到讀取完畢發出信號asyncState.EvtHandle.WaitOne();Console.WriteLine();Console.WriteLine("read complete");Console.Read();}}//異步讀取回調處理方法public static void AsyncReadCallback(IAsyncResult asyncResult){var asyncState = (AsyncState)asyncResult.AsyncState;int readCn = asyncState.FS.EndRead(asyncResult);//判斷是否讀到內容if (readCn > 0){byte[] buffer;if (readCn == bufferSize) buffer = asyncState.Buffer;else{buffer = new byte[readCn];Array.Copy(asyncState.Buffer, 0, buffer, 0, readCn);}//輸出讀取內容值string readContent = Encoding.UTF8.GetString(buffer);Console.Write(readContent);}if (readCn < bufferSize){asyncState.EvtHandle.Set();}else {Array.Clear(asyncState.Buffer, 0, bufferSize);//再次執行異步讀取操作asyncState.FS.BeginRead(asyncState.Buffer, 0, bufferSize, new AsyncCallback(AsyncReadCallback), asyncState);}}} }?二、異步寫入數據
class Program{/// <summary>/// 異步回調需要的參數封裝類/// </summary>class AsyncState {public int WriteCountOnce { get; set; }public int Offset { get; set; }public byte[] Buffer { get; set; }public ManualResetEvent WaitHandle { get; set; }public FileStream FS { get; set; }}static void Main(string[] args){//準備一個1K的字節數組byte[] toWriteBytes = new byte[1 << 10];for (int i = 0; i < toWriteBytes.Length; i++){toWriteBytes[i] = (byte)(i % byte.MaxValue);}string filePath = "d:\\test.txt";//FileStream實例using (var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.Read)){ int offset = 0;//每次寫入32字節int writeCountOnce = 1 << 5;//構造回調函數需要的狀態AsyncState state = new AsyncState{WriteCountOnce = writeCountOnce,Offset = offset,Buffer = toWriteBytes,WaitHandle = new ManualResetEvent(false),FS = fileStream};//做異步寫操作fileStream.BeginWrite(toWriteBytes, offset, writeCountOnce, WriteCallback, state);//等待寫完畢或者出錯發出的繼續信號state.WaitHandle.WaitOne();}Console.WriteLine("Done");Console.Read();}/// <summary>/// 異步寫的回調函數/// </summary>/// <param name="asyncResult">寫狀態</param>static void WriteCallback(IAsyncResult asyncResult){AsyncState state = (AsyncState)asyncResult.AsyncState;try{state.FS.EndWrite(asyncResult);}catch (Exception ex){Console.WriteLine("EndWrite Error:" + ex.Message);state.WaitHandle.Set();return;}Console.WriteLine("write to " + state.FS.Position);//判斷是否寫完,未寫完繼續異步寫if (state.Offset + state.WriteCountOnce < state.Buffer.Length){state.Offset += state.WriteCountOnce;Console.WriteLine("call BeginWrite again");state.FS.BeginWrite(state.Buffer, state.Offset, state.WriteCountOnce, WriteCallback, state);}else {//寫完發出完成信號state.WaitHandle.Set();}}?
轉載于:https://www.cnblogs.com/wywnet/p/4763693.html
總結