2015-09-29 6 views
6

ReadAll***/WriteAll***/のように、Fileクラスにはかなり便利な方法があります。どこにあるのFIle.ReadAll *** Async/WriteAll *** Async/AppendAll ***非同期メソッドですか?

私はそれらの非同期の対応が必要な場合、多くのケースに直面していますが、それらは存在しません。

なぜですか?落とし穴がありますか?
これらのメソッドは簡単に実装できますが、フレームワークでそれらを実装しない理由は何ですか?

+0

Downvoter、説明はありますか? – Dennis

+0

おそらく私はあなたの質問を理解できませんが、これでは十分ではありませんか? 'static async Task WriteAllTextAsync(文字列パス、文字列の内容){Task.Run(()=> File.WriteAllText(path、contents))を待つ。 } ' –

+3

@codroipo:これは" async over sync "と呼ばれ、避けなければなりません。たとえば、次の記事を参照してください。http://blog.stephencleary.com/2013/10/taskrun-etiquette-and-proper-usage.html – Dennis

答えて

4

"...私は非同期の対応が必要ですが、存在しません。なぜですか?"

(心の中で非同期で開発された新しいライブラリを含まない)非同期のawaitと一緒に.NETフレームワークに追加されたXXXAsync方法のすべては、単にBeginXXX/EndXXXのラッパーです。

彼らは新しい非同期操作を追加せず、古いものを新しいタスクベースのものに変換しました。たとえば、これはUdpClient.SendAsyncです:

public Task<int> SendAsync(byte[] datagram, int bytes) 
{ 
    return Task<int>.Factory.FromAsync(BeginSend, EndSend, datagram, bytes, null); 
} 

File.BeginReadAllFile.EndReadAll何が存在しないので、それはFile.ReadAllAsyncはありませんことを理解できるのです。

落とし穴がありますか?

これらのメソッドを実装した唯一の落とし穴は、真に非同期的なやり方で、非同期的ではないことです。

+1

答えを言い換えると、「私たちはあまりにも怠けていました」。 :) – Dennis

+0

@Dennisもっと古いライブラリに新しい機能を追加するのと同じように(しかし、はい...)。 – i3arnon