日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

异步读写数据流

發布時間:2025/7/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 异步读写数据流 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、異步讀取數據

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

總結

以上是生活随笔為你收集整理的异步读写数据流的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。