2016-03-20 14 views
2

F # öğreniyorum ve WriteLineAsync kullanarak sorunum var. senkron kod ileWriteLineAsync kullanarak F #

mükemmel çalışır:

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))) 

Ben kullanıcı WriteLineAsync çalıştığınızda:

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)) 

aldığım hata InvalidOperationException: dere yazar önceki yazma işlemi tarafından şu anda kullanımda.

Neyi yanlış yapıyorum?

+1

sen/yazma aynı anda aynı dosyayı değiştirebilir nasıl. Dosyada doğru işlem yapmıyorsunuz. sözdizimi iyi. –

+0

Aynı dosya – WaldiMen

cevap

2

Tüm AwaitTask, Task<T>'dan Async<T>'a dönüştürdüğü için aslında hiçbir şey beklemez. Yani sonuç sadece ignore olamaz. Ne yapabilirsiniz

do! kullanarak WriteLineAsync() bir async iş akışı oluşturmak ve beklemek üzere geçerli:

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

değil. Bunu açıkladığınız için teşekkürler. – WaldiMen