首页 > 代码库 > AsyncStreamCopier类(NetworkComms 2.3.1源码了解和学习)
AsyncStreamCopier类(NetworkComms 2.3.1源码了解和学习)
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源码了解和学习)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。