c# - FileStream WriteAsync 和 await 混淆

标签 c# .net filestream async-await

我正在查看 C# 中新的 asyncawait 关键字,只是想感受一下它们。

我正在查看 MSDN FileStream.WriteAsync() example ,而且我不确定我是否理解了什么。

例子如下:

using System;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.IO;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            UnicodeEncoding uniencoding = new UnicodeEncoding();
            string filename = @"c:\Users\exampleuser\Documents\userinputlog.txt";

            byte[] result = uniencoding.GetBytes(UserInput.Text);

            using (FileStream SourceStream = File.Open(filename, FileMode.OpenOrCreate))
            {
                SourceStream.Seek(0, SeekOrigin.End);
                await SourceStream.WriteAsync(result, 0, result.Length);
            }
        }
    }
}

我没有得到的是 await 的位置。似乎您不能接受 WriteAsync() 返回的 Task 项,因为这总是给我一个语法错误。所以我能让它编译的唯一方法是在调用中保留 await

但是如果你这样做,它不等待调用完成吗?这使得它不是很异步......

最佳答案

我怀疑问题出在您对 await 功能的理解上。

But if you do this, does it not wait for the call to finish? This makes it not very asynchronous...

当您await 某事时,您“异步阻塞”- 异步操作完成后您的异步函数将继续,但立即调用将立即完成。

因此在您的情况下,UI 线程变得畅通,因为 Button_Click 返回,但是当文件写入操作完成时,执行将返回(仍在 UI 线程中)到 await 表达式...然后您将关闭 FileStream 并完成异步功能。

如果您在 await 表达式之后执行其他操作(例如更新 UI),将会更清楚发生了什么。但是,是的,它确实是异步的 - 它只允许您编写看起来同步的代码。

关于c# - FileStream WriteAsync 和 await 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13841381/

相关文章:

c# - 通过 ActiveX 控件在 JavaScript 中启动应用程序时转义路径

c# - .NET XmlSerializer 和小数

c# - 我可以在 32 位系统上运行在 64 位系统上开发的 C# 应用程序吗?

c# - FileStream 与/差异 StreamWriter?

c# - 如何在 C#.net 中读取 Windows 应用程序根目录中的文件?

c# - c# 按下按键动态移动表单

c# - Lucene.net 搜索引擎

c# - 从 QueueUserWorkItem 移动到任务

c# - 如何处置由类 FileInfo 创建的对象?

java - 将字符串解析为形状