2016-03-20 5 views
2

私はF#を学習しており、WriteLineAsyncの使用に問題があります。同期コード付きFでのWriteLineAsyncの使用#

は、それが完璧に動作します:

using (new StreamWriter(new FileStream(@"c:\work\f2.txt", FileMode.Create, FileAccess.Write, FileShare.None, bufferSize= 4096, useAsync= true))) 
(fun sw -> File.ReadLines @"c:\Work\f1.txt" |> Seq.iter(fun x-> sw.WriteLine(x))) 

私は、ユーザーWriteLineAsyncにしようとすると:

using (new StreamWriter(new FileStream(@"c:\work\f2.txt", FileMode.Create, FileAccess.Write, FileShare.None, bufferSize= 4096, useAsync= true))) 
    (fun sw -> File.ReadLines @"c:\Work\f1.txt" |> Seq.iter(fun x-> sw.WriteLineAsync(x) |> Async.AwaitTask |> ignore)) 

私が得たエラーと、InvalidOperationExceptionを:ストリームライターは、前回の書き込み操作によって現在使用中です。

私は間違っていますか?

+1

あなたが書くことができますどのように/同時に同じファイルを変更します。あなたはファイルに対して正しい操作を行っていません。構文は問題ありません。 –

+0

これは同じファイルではありません – WaldiMen

答えて

2

すべてAwaitTaskは、Task<T>からAsync<T>に変換されますが、実際には何も待っていません。つまり、結果はignoreになります。あなたは何ができるか

asyncワークフローを作成することであり、do!を使用してWriteLineAsync()を待つ:

async { 
    use sw = new StreamWriter(new FileStream(@"c:\work\f2.txt", FileMode.Create, FileAccess.Write, FileShare.None, bufferSize= 4096, useAsync= true)) 
    for line in File.ReadLines @"c:\Work\f1.txt" do 
     do! sw.WriteLineAsync(line) |> Async.AwaitTask 
} 
+0

それを明確にしていただきありがとうございます。 – WaldiMen

関連する問題