2012-02-25 43 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個線程?複製文件通常不受CPU限制,因此線程實際上會使其速度變慢*,而不是更快。如果你想按順序運行線程,爲什麼你不這樣做,而不使用任何線程? – svick 2012-02-25 01:58:03

+0

即時通訊對不起,我沒有解釋我的應用程序..其客戶端服務器..它讓我能夠控制文件和文件夾..並探索他們..所以如果我沒有使用線程..它會滯後,我複製文件時將無法探索..所以我不得不使用線程,以便我可以探索和重命名,並在複製時查看大小和其他所有內容。 – 2012-02-25 11:30:06

+0

然後使用* * *線程,請參閱編輯我的答案。 – svick 2012-02-25 12:06:05

回答

-1

我已經想通了

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

     } 
    } 
} 
+2

您並未向隊列添加任何內容。你只是鎖定這段代碼。 – 2012-02-25 01:26:42

+0

這沒有任何意義。爲什麼當他們只等待對方時創建所有線程? – svick 2012-02-25 02:03:42

+0

它是一個大文件複製..假設它是每個文件1千兆字節..我有3個文件..你想讓計算機一起啓動這些線程?對我來說.. LOCK ..只是工作完美。 – 2012-02-25 10:13:41

0

,我認爲沒有理由在這裏使用線程。你只是讓你的代碼更復雜,消耗太多內存(每個線程需要1 MB的內存)。做這樣的事情,你會不會擔心隊列或鎖:

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

編輯:

如果您需要使用其他的線程比主線程,因爲你不想要鎖定它,可以使用一個線程完成所有的複製。類似於:

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

仍然不需要使用鎖,並且比使用多線程的解決方案更加節省內存。

+0

確定這裏的東西..由於某些原因,我需要確認每個文件,並檢查是否存在和這些東西..我發送到服務器每一次單一文件(路徑)複製..它使用一個線程的..所以服務器接收來自客戶端的路徑,它發送一個FOREACH LOOP ..這意味着它不會發送所有的路徑在一個發送..所以它會運行很多線程..這就是爲什麼我必須使用鎖定...因爲每個文件使用線程..我嘗試了很多時間來編輯我的代碼使用最好的方式..但它以這種方式結束..如果你知道我的意思。 – 2012-02-25 12:26:59

+0

客戶端有當前文件夾/文件的列表視圖..它檢查文件/文件夾是否存在每個copiedItems ..顯示確認消息..如果是的話,它發送路徑到服務器..如果沒有..它跳到另一個文件和那樣.. – 2012-02-25 12:33:48

+0

不,我真的不知道你的意思。如果你不解釋你需要什麼,只知道你告訴過我們,那很難幫助你。現在看起來實際上需要的實際上是一個隊列,一個線程從中獲取項目並進行復制,另一個線程可以將項目添加到隊列中。最簡單的方法是使用BlockingCollection '。 – svick 2012-02-25 12:33:53