.NET相关问题: 异步流处理2011-11-14 msdn Stephen Toub问:我已经阅读了一些绝妙的技巧,可以使用 C# 迭代器轻松地开发异步实现。(Jeffrey Richter 在前一期《MSDN® 杂志》中曾高度赞扬过此类技术。)但是,我曾尝试找出如何在不进行此类代码转 换的情况下完成相似的工作,那真是困难重重。例如,比方说我想仅通过对 Stream 使用异步方法便从一 个流复制到另一个流。我知道如何发出一次异步请求(完成一次读和一次写操作),但如何才能够继续循 环请求以便处理整个流呢?这可能吗?问:我已经阅读了一些绝妙的技巧,可以使用 C# 迭代器 轻松地开发异步实现。(Jeffrey Richter 在前一期《MSDN® 杂志》中曾高度赞扬过此类技术。)但 是,我曾尝试找出如何在不进行此类代码转换的情况下完成相似的工作,那真是困难重重。例如,比方说 我想仅通过对 Stream 使用异步方法便从一个流复制到另一个流。我知道如何发出一次异步请求(完成一 次读和一次写操作),但如何才能够继续循环请求以便处理整个流呢?这可能吗?答:是的,可 能。我将使用您的示例介绍如何通过 C# 和 Visual Basic® 完成此项工作(请注意,Visual Basic 不提供对迭代器的编译器支持)。为了设置此阶段,图 1 显示了我们希望异步实现的同步实现,该实现 可通过以下代码调用:答:是的,可能。我将使用您的示例介绍如何通过 C# 和 Visual Basic® 完成此项工作(请注意,Visual Basic 不提供对迭代器的编译器支持)。为了设置此阶段, 图 1 显示了我们希望异步实现的同步实现,该实现可通过以下代码调用:Figure 1 Synchronous CopyStreamToStream
public static void CopyStreamToStream( Stream source, Stream destination, Action<Stream, Stream, Exception> completed){ byte[] buffer = new byte[0x1000]; int read; try { while ((read = source.Read(buffer, 0, buffer.Length)) > 0) { destination.Write(buffer, 0, read); } if (completed != null) completed(source, destination, null); } catch (Exception exc) { if (completed != null) completed(source, destination, exc); }}FileStream input = ...;FileStream output = ...;CopyStreamToStream(input, output, (src,dst,exc) => { src.Close(); dst.Close();});