我正在查看 C# 中新的 async
和 await
关键字,只是想感受一下它们。
我正在查看 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/