Где я могу получить что-то с асинхронным копированием потока в .net - PullRequest
0 голосов
/ 29 марта 2012

Я прочитал статью о асинхронном копировании потоков .Я заметил, что только один буфер используется для чтения / записи.

Откуда мне что-то делает потоковое копирование с использованием асинхронных вызовов?

Из-за одного буфера кажется, что ваше асинхронное решение во время выполнения очень синхронно.Запись должна ждать чтения, а следующее чтение должно ждать, пока не будет записан буфер.

Некоторые мысли:

Я видел варианты, использующие несколько буферов.ИМХО, что только делает вещи более сложными, использует больше памяти и откладывает проблему.Он позволяет выполнять несколько операций чтения параллельно с записью в некоторой степени.

В случае файлов я могу представить более простое решение для записи: запись блока при чтении и исправление порядка при чтении всех файлов.(файловая система должна поддерживать это).

Я прочитал статью, потому что я использую .NET 3.5 и пока не могу использовать .NET 4 или 4.5.

(Netqa в Microsoft dot com ad ad возвращается)

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Асинхронная обработка помогает всякий раз, когда вы имеете дело с задержками, не связанными с ЦП, и хотите избежать тех, которые не охватывают безумное количество потоков (что плохо масштабируется - не должно быть слишком много потоков на ЦП, потому что потоки «дорогие» ресурсы, обильное переключение контекста может снизить производительность).

Таким образом, типичными получателями являются операции ввода-вывода, поскольку как диск, так и сеть "медленны" по сравнению с вычислительными усилиями, необходимыми для обработки данных. Поэтому, когда у вас может быть много параллельных потоков (сетевых и дисковых), вы должны использовать асинхронные операции для их обработки.

Тем не менее, правильное асинхронное программирование сложно, особенно без встроенной поддержки в новых компиляторах .NET.

Хорошая асинхронная копия должна использовать как минимум два буфера; один читает данные (асинхронный), а другой пишет данные (асинхронный) одновременно. Конечно, бездействующий считыватель запускается только после того, как считыватель завершает работу со своим блоком, а бездействующий считыватель запускается только тогда, когда имеется по меньшей мере резервный буфер (например, записывающее устройство завершило запись). Когда у вас есть только один буфер, между последовательными операциями чтения и записи будут разрывы, например это всегда будет «читать, писать, читать, ... писать» вместо «читать, читать + писать, читать + писать, ... писать».

1 голос
/ 29 марта 2012

Запись должна ждать чтения

Конечно, это так.Что бы вы написали, если бы вы еще не прочитали данные?

при следующем чтении нужно было дождаться записи в буфер.

В некоторых случаях избегать этого может иметь смысл, но вам действительно нужно это профилировать.Различные кэши и способ чтения и записи данных с жесткого диска могут повлиять на это.Если бы был какой-то выигрыш в производительности, он, вероятно, не был бы очень большим.

Теперь к вашему основному вопросу:

Где получение потоковой копии с использованием асинхронных вызовов дает мне что-то?

Выигрыш происходит из-за того, что вы не блокируете ни один поток, пока происходит IO.Это важно для производительности, потому что потоки являются дорогостоящими ресурсами (помимо прочего, каждому требуется 1 МБ как виртуальной, так и физической памяти).Это может иметь огромное значение в такой среде, как ASP.NET, где каждый запрос обрабатывается различным потоком.

Если вы пишете настольное приложение, которое просто копирует несколько файлов, это, вероятно, не имеет значения длявы, если вы не блокируете поток пользовательского интерфейса.

...