標籤:
networkComms.net2.3.1開源版本,基於gpl V3協議。因為不能公開3.x版本的源碼,所以基於此版本進行學習。3.X版本進行了諸多改進和Bug修複,使用方法上兩者相差不大。/*請注意使用以下代碼,需遵循GplV3協議*/using System;using System.Collections.Generic;using System.Text;using System.IO;using System.Threading;namespace DPSBase{ public class AsyncStreamCopier { /// <summary> /// 拷貝資料完成 觸發的事件 /// </summary> public event EventHandler Completed; private byte[] buffer = new byte[4096]; public AsyncStreamCopier() { } /// <summary> ///開始一個非同步資料拷貝 /// </summary> public void Start(Stream input, Stream output) { GetNextChunk(new Stream[] { input, output }); } private void GetNextChunk(Stream[] streams) { var input = streams[0]; //把Stream[0] 中的輸入資料流中的資料讀取到buffer中,當buffer中的資料讀取完成後,觸發InputReadComplete方法 input.BeginRead(buffer, 0, buffer.Length, InputReadComplete, streams); } private void InputReadComplete(IAsyncResult ar) { var streams = ar.AsyncState as Stream[]; var input = streams[0]; var output = streams[1]; //等待掛起的非同步讀取完成。 int bytesRead = input.EndRead(ar); if (bytesRead == 0) { RaiseCompleted(); return; } // 同步寫入 output.Write(buffer, 0, bytesRead); // 讀取下一資料區塊 GetNextChunk(streams); } private void RaiseCompleted() { if (Completed != null) { Completed(this, EventArgs.Empty); } } public static void CopyStreamTo(Stream source, Stream destination) { //號誌-預設無訊號 來進程不得通行 var completedEvent = new ManualResetEvent(false); // copy as usual but listen for completion var copier = new AsyncStreamCopier(); //一旦完成,給訊號 copier.Completed += (s, e) => completedEvent.Set(); //開始拷貝資料,如果拷貝資料完成,觸發號誌 copier.Start(source, destination); //有交警 需要訊號 否則等待 completedEvent.WaitOne(); } }} http://www.cnblogs.com/networkcommshttp://www.networkcoms.cn 編輯
AsyncStreamCopier類(NetworkComms 2.3.1源碼瞭解和學習)