【微软技术栈】C#.NET 异步文件 I/O

异步操作使您能在不阻塞主线程的情况下执行占用大量资源的 I/O 操作。 在 Windows 8.x 应用商店应用或桌面应用中一个耗时的流操作可能阻塞 UI 线程并让应用看起来好像不工作时,这种性能的考虑就显得尤为重要了。

从 .NET Framework 4.5 开始,I/O 类型包括了异步方法,以简化异步操作。 异步方法在其名称中包括 Async ,例如 ReadAsync、 WriteAsync、 CopyToAsync、 FlushAsync、 ReadLineAsync和 ReadToEndAsync。 这些异步方法基于流类(例如 Stream、 FileStream和 MemoryStream)和用来向流中读出或写入数据的类(例如 TextReader 和 TextWriter)实现。

在 .NET Framework 4 和更早的版本中,你必须使用 BeginRead 和 EndRead 等方法来实现异步 I/O 操作。 这些方法仍然在当前 .NET 版本中可用,从而支持传统的代码;但是,异步方法能帮助你更轻松地实现异步 I/O 操作。

C# 和 Visual Basic 分别具有两个用于异步编程的关键字:

  • Async (Visual Basic) 或 async (C#) 修饰符,您可以用来标记包含异步操作的方法。

  • Await (Visual Basic) 或 await (C#) 运算符,可以应用到异步方法的结果中。

如下面的示例所示,若要实现异步 I/O 操作,请把这些关键字和异步方法结合使用。 

下面的示例演示如何使用两个 FileStream 对象把文件从一个目录异步复制到另一个目录。 需要注意 Click 控件的 Button 事件处理程序具有 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(Path.Combine(endDirectory, Path.GetFileName(filename))))
                    {
                        await sourceStream.CopyToAsync(destinationStream);
                    }
                }
            }
        }
    }
}

下一个例子类似于前面的例子,但是使用 StreamReader 和 StreamWriter 对象以异步方式读取和写入文本文件的内容。

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);
    }
}

下一个示例演示用于在 Windows 8.x 应用商店应用中以 Stream 的形式打开文件的代码隐藏文件和 XAML 文件,并且通过使用 StreamReader 类的实例来读取其内容。 它使用异步方法以流的形式打开文件并读取其内容。

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
{
    public sealed partial class BlankPage : Page
    {
        public BlankPage()
        {
            this.InitializeComponent();
        }

        private async void 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();
        }
    }
}
<Page
    x:Class="ExampleApplication.BlankPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:ExampleApplication"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <StackPanel Background="{StaticResource ApplicationPageBackgroundBrush}" VerticalAlignment="Center" HorizontalAlignment="Center">
        <TextBlock Text="Display lines from a file."></TextBlock>
        <Button Content="Load File" Click="Button_Click_1"></Button>
        <TextBlock Name="DisplayContentsBlock"></TextBlock>
    </StackPanel>
</Page>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: vb.netc#微软公司开发的两种面向对象的程序设计语言。 vb.net是Visual Basic的一种改进版本,它是一种易学易用的语言,适合初学者入门。它的语法结构简单清晰,代码书写风格更接近自然语言,因此比较容易理解和编写。vb.net提供了很多方便的功能和工具,可以快速开发Windows应用程序。与c#相比,vb.net对于处理COM组件和互操作性更为方便,适用于一些老式的系统和项目迁移。 c#是一门更加强大和灵活的语言,它的语法和C/C++类似,同时又结合了面向对象和组件开发的特点。c#拥有更多的功能和特性,比如匿名方法、泛型、LINQ等,可以编写更高效和复杂的程序。c#广泛应用于Web应用程序、手机应用程序和游戏开发等领域。与vb.net相比,c#更加注重性能和效率,适用于大型的项目开发。 虽然vb.netc#语言上存在一些不同,但它们都是面向对象的语言,只是在语法和特性上略有差异。所以对于有基础的程序员来说,学习另一种语言并不困难,只需花一些时间来了解和适应其中的差异。 总的来说,vb.net适合初学者或者对简单程序需求的开发者,c#对于需要性能、复杂性和灵活性较高的项目更为适用。无论选择哪种语言,掌握基本的编程原理和逻辑思维都是非常重要的。 ### 回答2: VB.NETC#.NET平台上两种常见的编程语言,它们都是由微软公司开发的,并且都具备类似的语法和功能。 首先,VB.NET是Visual Basic的后续版本,在语法上保留了部分Visual Basic 6.0的特性。它的语法相对来说更加容易学习和理解,代码的可读性较高。VB.NET的开发速度较快,适合用于快速原型的开发和初学者学习编程。此外,VB.NET支持事件驱动编程,有丰富的图形用户界面(GUI)开发工具和库。虽然VB.NET在一些社区和开发者群体之间不如C#流行,但仍然在一些特定的应用场景中有着广泛的应用。 而C#是一种更加现代化和强大的编程语言,更加严格和规范。C#拥有更多的编程特性,比如面向对象编程和泛型等高级功能,开发者可以更加灵活地处理复杂的问题。C#的代码更加简洁、规范,可读性较高,它的运行效率也相对较高。C#在跨平台和服务器端开发领域有着广泛的应用,特别是在.NET Core的推动下,C#已经成为了一种非常受欢迎的编程语言。 总之,VB.NETC#在语法和功能上存在一些差异,选择使用哪种语言主要取决于开发者的个人喜好、项目需求以及技术栈。无论选择VB.NET还是C#,都可以在.NET平台上进行完美的应用开发。 ### 回答3: # VB.NETC#都是微软公司为开发者提供的两种主要的编程语言。它们都属于.NET平台下的语言,并且都可以用于开发各种类型的应用程序,包括桌面应用、Web应用、移动应用等。 VB.NET(即Visual Basic .NET)是VB语言的升级版本,在.NET框架下具有更强大的功能和更高的性能。它是一种易学易用的编程语言,注重可读性和可维护性,适合初学者入门。VB.NET采用面向对象的编程思想,具有丰富的类库和快速开发工具,能够快速构建应用程序。VB.NET在Windows平台下得到了广泛应用,并且具有优秀的可视化编程能力,可以通过拖拽控件的方式进行UI设计。 C#(即C Sharp)是一种现代化的面向对象编程语言,由微软开发。C#语言的语法与C和C++较为相似,易于掌握。它具有高效的执行速度和强大的功能,支持LINQ查询、异步编程等特性。C#适用于跨平台开发,并且具有良好的可扩展性和可移植性。C#.NET平台下得到了广泛应用,尤其适合开发Web应用和桌面应用,其对于.NET平台的集成开发环境(IDE)Visual Studio也非常强大。 总结来说,VB.NETC#是两种功能强大的编程语言,它们在语法、语义等方面虽有一定的差异,但都可以用于.NET平台下的应用程序开发。选择VB.NET还是C#主要取决于个人偏好、项目需求以及和其他开发人员的协作等因素。无论选择哪种语言,都可以通过学习它们的特性和使用场景,为开发高质量的应用程序提供支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吉特思米(gitusme)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值