打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
.NET4.5新功能:异步文件 I/O

从开始 .NET Framework 4.5 RC, I/O 类型包括异步方法简化异步操作。 异步方法在其名称中包含 Async ,例如 ReadAsyncWriteAsyncCopyToAsyncFlushAsyncReadLineAsyncReadToEndAsync 这些异步方法对流类,如 StreamFileStreamMemoryStream以及用于读取或写入使用至流 (如 TextReaderTextWriter的类。

在 .NET framework 4 和早期版本中,必须使用之类的方法 BeginReadEndRead 实现异步 I/O 操作。 这些方法可在 .NET Framework 4.5 RC 支持旧版代码;但是,异步方法帮助您更轻松地实现异步 I/O 操作。

从开始 Visual Studio 2012 RC, Visual Studio 为异步编程提供两个关键字:

  • Async (Visual Basic) 或 (c#) async 修饰符,用于指示方案包含一个异步操作。

  • Await (Visual Basic) 或 (c#) await 运算符,会应用于异步方法的结果。

如下面的示例所示,若要实现异步 I/O 操作,请使用异步方法结合使用这些关键字,。 有关更多信息,请参见 异步编程与异步和等待 (C# 和 Visual Basic)

下面的示例演示如何使用复制文件的两 FileStream 对象异步从一个目录到另一个。 请注意 Button 控件的 Click 事件处理程序标记 async 修饰符,因为它调用异步方法。

 

using System;using System.Threading.Tasks;using System.Windows;using System.IO;namespace WpfApplication{    public partial class MainWindow : Window    {        public MainWindow()        {            InitializeComponent();        }        private async void Button_Click(object sender, RoutedEventArgs e)        {            string StartDirectory = @"c:\Users\exampleuser\start";            string EndDirectory = @"c:\Users\exampleuser\end";            foreach (string filename in Directory.EnumerateFiles(StartDirectory))            {                using (FileStream SourceStream = File.Open(filename, FileMode.Open))                {                    using (FileStream DestinationStream = File.Create(EndDirectory + filename.Substring(filename.LastIndexOf('\\'))))                    {                        await SourceStream.CopyToAsync(DestinationStream);                    }                }            }        }    }}

 

下一个示例与前一个示例相似,但使用 StreamReaderStreamWriter 对象读取和写入文本文件的内容异步。

 

private async void Button_Click(object sender, RoutedEventArgs e){    string UserDirectory = @"c:\Users\exampleuser\";    using (StreamReader SourceReader = File.OpenText(UserDirectory + "BigFile.txt"))    {        using (StreamWriter DestinationWriter = File.CreateText(UserDirectory + "CopiedFile.txt"))        {            await CopyFilesAsync(SourceReader, DestinationWriter);        }    }}public async Task CopyFilesAsync(StreamReader Source, StreamWriter Destination) {     char[] buffer = new char[0x1000];     int numRead;     while ((numRead = await Source.ReadAsync(buffer, 0, buffer.Length)) != 0)     {        await Destination.WriteAsync(buffer, 0, numRead);    } } 

 

使用 StreamReader 类的实例,下一个示例演示用于打开文件为 Metro style app 的 Stream 的代码隐藏文件和 XAML 文件之后和读取其内容。 它使用异步方法打开文件以流和读取其内容。

 

                     using System;using System.IO;using System.Text;using Windows.Storage.Pickers;using Windows.Storage;using Windows.UI.Xaml;using Windows.UI.Xaml.Controls;namespace ExampleApplication{    publicsealedpartialclass BlankPage : Page    {        public BlankPage()        {            this.InitializeComponent();        }        privateasyncvoid Button_Click_1(object sender, RoutedEventArgs e)        {            StringBuilder contents = new StringBuilder();            string nextLine;            int lineCounter = 1;            var openPicker = new FileOpenPicker();            openPicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;            openPicker.FileTypeFilter.Add(".txt");            StorageFile selectedFile = await openPicker.PickSingleFileAsync();            using (StreamReader reader = new StreamReader(await selectedFile.OpenStreamForReadAsync()))            {                while ((nextLine = await reader.ReadLineAsync()) != null)                {                    contents.AppendFormat("{0}. ", lineCounter);                    contents.Append(nextLine);                    contents.AppendLine();                    lineCounter++;                    if (lineCounter > 3)                    {                        contents.AppendLine("Only first 3 lines shown.");                        break;                    }                }            }            DisplayContentsBlock.Text = contents.ToString();        }    }}

 

 

 

 

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
使用 Async 和 Await 的异步编程(C# 和 Visual Basic)(资料地址)
为什么编程语言对异步编程都是很晚近才开始支持的?
Windows8File/Folder Picker
C# 5.0大胆预言:async/await最给力-IT168 技术开发专区
await运算符只能用于异步方法中。请考虑用async修饰符标记此方法,并将其返回类型更改为Task
[js] 第103天 你是如何更好地处理Async/Await的异常的?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服