非同步方法讀取網路路徑 非同步讀取檔案字元流
阿新 • • 發佈:2019-01-07
1.非同步讀取地址下資訊
public void T_Invoke() { var request = WebRequest.Create("http://www.sina.com.cn"); //io yibu request.BeginGetRequestStream(AsyncCallbackImpl, request); } public void AsyncCallbackImpl(IAsyncResult ar) { WebRequest request = ar.AsyncState as WebRequest; var reponse = request.EndGetResponse(ar); var stream = request.GetRequestStream(); using (StreamReader reader=new StreamReader(stream)) { //values string str=reader.ReadLine(); } }
2.非同步時間 讀取路徑下檔案字元流資訊
public event EventHandler<ReturnEndReadEventargs> IsReturnEvent; FileStream InputStream; StringBuilder ReadValue; byte[] buffer; public string ReadFileAsync(string fileName) { ReadValue = new StringBuilder(); int BufferSize=0; buffer = new byte[BufferSize]; InputStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, BufferSize, useAsync: true); InputStream.BeginRead(buffer, 0, buffer.Length, OnCompleteRead, null); //InputStream.write return ReadValue.ToString(); } public void OnCompleteRead(IAsyncResult asyncResult) { //非同步讀取一個快,接收資料 int bytesRead = InputStream.EndRead(asyncResult); //如果沒有任何位元組,則流已達檔案結尾 if (bytesRead > 0) { //暫停以對模擬對資料塊的處理 Debug.WriteLine("非同步執行緒:已讀取一塊內容"); var datastr = Encoding.UTF8.GetString(buffer, 0, buffer.Length); ReadValue.Append(datastr); Thread.Sleep(TimeSpan.FromMilliseconds(20)); //開始讀取下一塊 InputStream.BeginRead(buffer, 0, buffer.Length, OnCompleteRead, null); } else { //操作結束 Debug.WriteLine(" 非同步執行緒:讀取檔案結束"); //event必須方法裡呼叫 OnIsReturnEvent(); } } protected virtual void OnIsReturnEvent() { IsReturnEvent?.Invoke(this, new ReturnEndReadEventargs(true, ReadValue.ToString())); //IsReturnEvent(this, new ReturnEndReadEventargs(true, ReadValue.ToString())); } public class ReturnEndReadEventargs : EventArgs { public ReturnEndReadEventargs(bool isReturn, string value) { IsReturn = isReturn; ReadValue = value; } public string ReadValue { get; set; } public bool IsReturn { get; set; } }