2009-12-04 2 views
4

У меня есть приложение, которое перемещает проект и его файлы из предварительного просмотра в производство с использованием интерфейсов Flex и веб-службы .NET. В настоящее время процесс занимает около 5-10 минут/на проект. Помимо проблем с задержкой, это действительно не так долго. Мне интересно, является ли это хорошим вариантом использования для многопоточности. Кроме того, учитывая, что пользователь может захотеть нажимать несколько проектов или один за другим, существует ли способ очереди заданий.C# - Перемещение файлов - в очередь или многопоточность

Любые предложения и примеры приветствуются.

Спасибо!

+3

Вы профилировали это, чтобы определить, почему это занимает больше времени, чем ожидалось? – 2009-12-04 18:53:38

+0

roygbiv - это на самом деле - нет точки многопоточности, если вы максимизируете пропускную способность диска или сети, и поэтому он занимает так много времени. Выясните, почему это так медленно, а не делает случайное, корректирующее действие. – Michael

+0

Как отмечают ройгбив и Майкл, вам нужно сделать некоторый анализ, чтобы вы не оптимизировали неправильные вещи. Сколько из 5-10 минут - процессор против дискового ввода/вывода против сетевого трафика. Может ли компрессия помочь? Существуют ли задачи, которые могут выполняться параллельно? Является ли ваше приложение в основном ожидающим веб-службы? Даже некоторые довольно простые следовые высказывания должны давать некоторые полезные замечания. –

ответ

4

Что-то, что делает тяжелый диск IO , как правило, не является хорошим кандидатом для многопоточности, поскольку диски действительно могут делать только одну вещь за раз. Однако, если вы нажимаете на несколько серверов или на серверах есть особенно хорошие дисковые подсистемы, то может быть полезно использование легкой потоковой передачи.

+1

Поскольку похоже, что он копирует файлы с одного сервера на другой (как правило, у вас разные серверы для производства и постановки), такая операция * будет иметь выгоду от асинхронного ввода-вывода или потоковой передачи, и в этом случае вы будете читать один буфер, затем в то время как вы пишете этот буфер в пункт назначения, вы параллельно читаете другой буфер из источника. Но прежде чем он точно выяснит, почему его текущее решение идет медленно, никто не может сказать, что именно поможет. –

0

Если вы перемещаете вещи между двумя компьютерами, сеть станет узким местом, поэтому вы можете захотеть поставить в очередь эти операции.

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

+0

Что делать, если диск работает медленно? Что делать, если он копирует 1 байт за раз и сообщает о прогрессе в графическом интерфейсе, используя синхронный вызов через границы потоков или используя то, что означает «Application.DoEvents», чтобы гарантировать, что графический интерфейс обновлен, чтобы отразить его новый прогресс? Я согласен с принципом, что в оптимальном решении сеть будет узким местом, но вы не можете сказать, что это * узкое место в его * текущем * решении. –

2

В качестве примечания - независимо от того, решили ли вы поставить в очередь задания, вы будете использовать многопоточность. Очередь - это всего лишь один способ обработки, который в конечном итоге решается с помощью многопоточности.

И да, я бы рекомендовал вам создать очередь для выталкивания каждого проекта.

0

Вам следует попробовать использовать ThreadPool.

ThreadPool.QueueUserWorkItem(MoveProject, project); 
+0

Как насчет FileStream, должен ли он это использовать? –

+0

Я предполагаю, что вы саркастичны. Причина, по которой я упомянул об этом, заключается в том, что он буквально сделает код многопоточным в 1 строке, а не сворачивает вашу собственную систему очередей. Это означает, что он может увидеть, есть ли польза почти сразу. – ChaosPandion

+2

Кстати, только потому, что у вас есть 33k очков, вы не имеете права быть рывком. – ChaosPandion

1

Вы должны сравнить скорость вашего кода по сравнению с простым копированием в Windows, (то есть, исследователь или командная строка) против копирования с чем-то продвинулся как TeraCopy. Если ваш код значительно медленнее Window, посмотрите на части вашего кода, чтобы оптимизировать использование профилировщика. Если ваш код работает так же быстро, как Windows, но медленнее, чем TeraCopy, то многопоточность может помочь.

Многопоточность обычно не нужна, когда операции ввода-вывода связаны, но копирование файлов связано с чтением с диска и записью по сети. Это две операции ввода-вывода, поэтому, если вы отделите их на разные потоки, это может повысить производительность. Для чего-то вроде этого вам нужна настройка производителя/потребителя, где у вас есть Circular queue с одним потоком, читаемым с диска и записывающим в очередь, и другим потоком, читающим из очереди и записывающим в сеть. Важно иметь в виду, что эти два потока не будут работать с одинаковой скоростью, поэтому, если очередь заполнена, подождите, прежде чем писать больше данных, а если она пуста, подождите, прежде чем писать. Также стратегия блокировки может иметь большое влияние на производительность здесь и может привести к снижению производительности до более медленной, чем однопоточная реализация.

0

Согласовано со всеми над ограниченной производительностью выполнения задач параллельно.

Если у вас есть полный контроль над вашей средой развертывания, вы можете использовать Rhino очереди:

http://ayende.com/Blog/archive/2008/08/01/Rhino-Queues.aspx

Это позволит вам создавать очереди заданий асинхронно (скажем, от службы WCF вызываются из ваших Silverlight/Flex) и потребляют их синхронно.

В качестве альтернативы вы можете использовать WCF и MSMQ, но кривая обучения больше.

0

При работе с несколькими файлами с использованием нескольких потоков обычно IS хорошая идея проблем performance.The главной причиной является то, что большинство дисков в настоящее время поддерживают native command queuing.

Недавно я написал статью о чтении/записи файлов с несколькими файлами на ddj.com.

См. http://www.ddj.com/go-parallel/article/showArticle.jhtml?articleID=220300055.

Смотрите также связанный с этим вопрос Will using multiple threads with a RandomAccessFile help performance?

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

Сказав, что я бы сказал, что нет другого способа узнать, чем пытаться использовать все возможные различные подходы. Это зависит от очень многих условий: Аппаратное обеспечение, ОС, Драйверы и т. Д.

0

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

Самое первое, что вам нужно сделать, это выяснить, что занимает много времени, чтобы закончить, а затем почему является он занимает много времени, чтобы закончить. То, что ваша операция «копирование» в целом длится достаточно долго, недостаточно хороша, вам нужно указать причину этого на метод или набор методов.

Пока вы этого не сделаете, все, что вы можете сделать с вашим кодом, скорее всего, будет догадкой. Мой опыт научил меня, что, когда дело доходит до производительности, 9 из 10 причин для медленных действий - это неожиданность для парня, написавшего код.

Итак, сначала измерьте сначала, затем измените.

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

Но это только догадка, пока вы не знаете, поэтому сначала измерьте, а затем измените.

+0

Вы правы, у меня нет инструмента для профилирования. Я использую VS Professional, а не версию Team Development. - Что значит код регистрации? Контрольные точки? Спасибо! –

+0

Как Debug.WriteLine ("точка # 1:" + DateTime.Now); –

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