2015-09-29 2 views
6

В категории File есть куча довольно удобных методов, например ReadAll***/WriteAll***/AppendAll***.Где находится FIle.ReadAll *** Async/WriteAll *** Async/AppendAll *** Методы Async?

Я столкнулся с рядом случаев, когда мне нужны их асинхронные копии, но их просто не существует.

Почему? Есть ли подводные камни?
Я знаю, что эти методы могут быть легко реализованы, но есть ли какие-либо причины не реализовывать их в кармане из коробки?

+0

Downvoter, любое объяснение? – Dennis

+0

Возможно, я не понимаю ваш вопрос, но этого недостаточно? 'static async Задача WriteAllTextAsync (строка, содержимое строки) {Ожидание Task.Run (() => File.WriteAllText (путь, содержимое)); } ' –

+3

@codroipo: это называется« асинхронно по синхронизации », и его следует избегать. См. Эту статью, например: http://blog.stephencleary.com/2013/10/taskrun-etiquette-and-proper-usage.html – Dennis

ответ

4

«... Мне нужны их асинхронные копии, но их просто нет. Почему?»

Всех XXXAsync методы, которые были добавлены в рамки .Net вместе с асинхронным Await (не включая новые библиотеки, разработанные с асинхронномом в виде) просто обертки вокруг BeginXXX/EndXXX.

Они не добавляли новых асинхронных операций, а просто превращали старые в новые, основанные на задачах. Например, это UdpClient.SendAsync:

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

Поскольку нет нет File.BeginReadAll и File.EndReadAll это понятно, что нет File.ReadAllAsync.

Есть ли подводные камни?

Единственная ошибка с внедрением этих методов делает это по-настоящему асинхронным образом, а не подделкой async.

+1

Итак, чтобы перефразировать ваш ответ, «мы были слишком ленивы, чтобы сделать это». :) – Dennis

+0

@Dennis больше похоже, что они не добавляют новые функции в старые библиотеки (но да ...). – i3arnon

Смежные вопросы