6

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

私が得られないのは、の配置ですawaitTask返されるアイテムはWriteAsync()、常に構文エラーが発生するため、取得できないようです。したがって、これをコンパイルする唯一の方法はawait、を呼び出したままにすることです。

しかし、これを行うと、通話が終了するのを待ちませんか?これはそれをあまり非同期にしません...

4

2 に答える 2

15

問題は、何をしているのかを理解していることにあると思いますawait

しかし、これを行うと、通話が終了するのを待ちませんか?これはそれをあまり非同期にしません...

何かをするときはawait、「非同期でブロック」します。非同期操作が完了すると、非同期関数は続行されますが、即時呼び出しはすぐに完了します。

したがって、あなたの場合、Button_Click戻るためにUIスレッドのブロックが解除されますが、ファイルの書き込み操作が完了すると、実行は式の最後に戻ります(UIスレッド内にあります)await...次に、を閉じてFileStream完了します。非同期機能。

式の後に何か他のことをした場合await(たとえば、UIの更新)、何が起こっていたのかがより明確になります。しかし、はい、それは実際には非同期です-それはあなたが同期しているように見えるコードを書くことを可能にするだけです。

于 2012-12-12T14:01:18.550 に答える
2

待機中は、awaitが実際にブロックされることはありません。何が起こるかというと、コンパイラーは、待機後にすべてのコードのいわゆる継続を作成するためにいくつかの複雑な処理を実行し、完了時にその継続を実行するようにタスクに指示します。

基本的に、Button_Clickメソッドの最後の行は次のように変換されます。

FileStream SourceStream = File.Open(filename, FileMode.OpenOrCreate);
SourceStream.Seek(0, SeekOrigin.End);
Task t = SourceStream.WriteAsync(result, 0, result.Length);
t.ContinueWith(_ => SourceStream.Dispose());

もちろん、これは、たとえばWriteAsyncがすぐに完了すると、より効率的に実行されるため、単純化されます。

于 2012-12-12T14:06:10.633 に答える