FileStream WriteAsync并等待混淆

poy*_*poy 6 .net c# filestream async-await

我正在研究C#中的新关键字asyncawait关键字,并试图感受它们.

我正在看MSDN FileStream.WriteAsync() 示例,我不确定我理解了什么.

示例如下:

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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我没有得到的是放置await.您似乎无法获取Task返回的项目,WriteAsync()因为这总是给我一个语法错误.因此,我可以将其编译的唯一方法是通过await调用.

但如果你这样做,是不是等待电话完成?这使它不是非常异步......

Jon*_*eet 14

我怀疑问题在于你对什么有所了解await.

但如果你这样做,是不是等待电话完成?这使它不是非常异步......

当你await做某事时,你"异步阻塞" - 当异步操作完成时你的异步函数将继续,但立即调用将立即完成.

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

如果你在表达式之后做了其他事情await(例如更新UI),那将会更清楚.但是,它确实异步的 - 它只允许您编写看起来同步的代码.

  • @Andrew:的确如此.但是当你的异步函数等待它完成时,它*不会*阻止UI线程.这就像订购比萨饼 - 你不能*吃比萨饼直到交付,但你可以做其他事情:) (5认同)