2012-02-25 2 views
1

Я делаю сервер-клиентское приложение. Клиент может управлять файлами сервера (переименовывать/копировать/удалять и т. Д.) Когда я выбираю более одного типа (n) файлов для копирования/вставки, он запускает (n) потоки pasteCкак начать много потоков в очереди?

Мне нужен способ сделать их в очереди. Как это сделать???

private void Paste() 
{ 
    foreach (ListViewItem item in copiedItems) 
    { 
     Thread pasteC = new Thread(unused => fmc.PasteFromCopy(item.Text, somePath)); 
     pasteC.Start(); 
    } 
} 

код вниз в FMC классе ..

public void PasteFromCopy(string source,string dest) 
{ 
    if (IsFolder(source)) 
    { 
     CopyDirectory(source, dest); 
    } 
    else 
    { 
     CopyStream(source, dest); 
    } 
} 
+1

Почему он запускает n потоков? Копирование файлов обычно не привязывается к ЦП, поэтому потоки будут делать это медленнее *, а не быстрее. И если вы хотите последовательно запускать потоки, почему бы вам просто не сделать этого, не используя нити? – svick

+0

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

+0

Затем используйте только один * поток, см. редактирование моего ответа. – svick

ответ

-1

я понял это

public void PasteFromCopy(string source,string dest) 
{ 
    lock(this) 
    { 
     if (IsFolder(source)) 
     { 
      CopyDirectory(source, dest); 
     } 
     else 
     { 
      CopyStream(source, dest); 

     } 
    } 
} 
+2

Вы ничего не добавляете в очередь. Вы просто блокируете этот блок кода. –

+0

Это не имеет никакого смысла. Почему вы создаете все потоки, когда они только ждут друг друга? – svick

+0

это большая копия файла .. предположим, что это 1 гигабайт для каждого файла .. и у меня есть 3 файла .. вы хотите, чтобы компьютер начал эти потоки вместе? для меня .. LOCK .. просто сработал отлично. –

0

Я думаю, что нет никаких оснований для использования темы здесь. Вы просто делаете свой код более сложным и потребляете слишком много памяти (для каждого потока требуется 1 МБ памяти). Сделайте что-то вроде этого, и вам не придется беспокоиться об очередях или замков:

private void Paste() 
{ 
    foreach (ListViewItem item in copiedItems) 
    { 
     fmc.PasteFromCopy(item.Text, somePath); 
    } 
} 

EDIT:

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

private void Paste() 
{ 
    var thread = new Thread(() => 
    { 
     foreach (ListViewItem item in copiedItems) 
     { 
      fmc.PasteFromCopy(item.Text, somePath); 
     } 
    }); 
    thread.Start(); 
} 

По-прежнему не нужно использовать замки и намного больше памяти, чем ваше решение со многими потоками.

+0

ОК, вот что-то ... по некоторым причинам, что мне нужно подтвердить каждый файл и проверить, существует ли это и все такое. Я отправляю на сервер один файл (путь) каждый раз для копирования .. он использует один поток для этого. поэтому сервер получает пути с клиентской стороны, которые отправляют в FOREACH LOOP .. это означает, что он не отправляет все пути в одной отправке .. поэтому он будет запускать много потоков .. поэтому мне пришлось использовать блокировку .. потому что каждый файл использует поток. Я много раз пытался отредактировать свой код, чтобы использовать наилучший способ ... но он заканчивается таким образом .. если вы знаете, что я имею в виду. –

+0

У клиента есть список из текущих папок/файлов .. он проверяет, существует ли файл/папка для каждого файла copiedItems .. показать сообщение подтверждения .. если да, он отправляет путь к серверу .. если нет .. он переходит к другому файл и т. д. –

+0

Нет, я не знаю, что вы имеете в виду.Трудно вам помочь, если вы не объясните, что именно вам нужно, и только знаете, что вы нам сказали. Теперь кажется, что вам действительно нужна на самом деле очередь, один поток берет из нее элементы и делает копирование, другой поток может добавлять элементы в очередь. Самый простой способ сделать это - использовать «BlockingCollection ». – svick

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