2013-02-13 62 views
-2

我做了一個服務,讀取一個XML。在XML中我有輸入目錄和輸出目錄。該服務選取輸入目錄中的文件並重命名它們並將它們移到輸出目錄。我想在服務中實現線程。我希望它在一個線程中選擇一個xml節點,而在另一個線程中選擇其他節點。或者,如果不考慮節點,一個線程選擇要執行的前10個操作,接下來的10個等等。這樣所有節點都以並行方式處理。誰可以幫我這個事?我嘗試閱讀幾個線程教程,但無法通過它們獲得很多。該服務代碼如下:線程的Windows服務

XmlDocument doc = new XmlDocument(); 
      doc.Load("Data.xml"); 
      int count = doc.SelectNodes("Data/DataClass").Count; 
      for (int i = 1; i < count; i++) 
      { 
       string xpath = "/Data/DataClass[" + i + "]"; 
       XmlNode node = doc.SelectSingleNode(xpath); 
       XmlNodeList subnode = node.ChildNodes; 
       string pathO = ""; 
       string pathI = subnode[0].InnerText; 
       string prefix = subnode[2].InnerText; 
       string freq = subnode[3].InnerText; 
       string[] filenames = Directory.GetFiles(pathI); 
       node.ParentNode.RemoveChild(doc.SelectSingleNode(xpath)); 
       doc.Save("Data.xml"); 

       foreach (string filename in filenames) 
       { 
        pathO = subnode[1].InnerText; 
        pathO = pathO + "\\" + prefix; 
        string fname = Path.GetFileName(filename); 
        pathO = pathO + fname; 
        System.IO.File.Move(filename, pathO); 

       } 
      } 
+0

你應該放棄想想你需要多少個線程,只是讓Imran幫你 – 2013-02-14 03:17:18

回答

1

使用的Parallel.For或Parallel.ForEach,請檢查下面的代碼,它的簡單,我修改您的代碼在這裏只所以用VS檢查(有可能的微小變化根據您的要求)。

XmlDocument doc = new XmlDocument(); 
doc.Load("Data.xml"); 
int count = doc.SelectNodes("Data/DataClass").Count; 
Parallel.For(0,doc.SelectNodes("Data/DataClass").Count-1,i => 
{ 
    XmlNode node = doc.SelectNodes("Data/DataClass")[i]; 
    XmlNodeList subnode = node.ChildNodes; 
    string pathO = ""; 
    string pathI = subnode[0].InnerText; 
    string prefix = subnode[2].InnerText; 
    string freq = subnode[3].InnerText; 
    string[] filenames = Directory.GetFiles(pathI); 
    doc.Save("Data.xml"); 
    foreach (var filename in filenames) 
    { 
     pathO = subnode[1].InnerText; 
     pathO = pathO + "\\" + prefix; 
     string fname = Path.GetFileName(filename); 
     pathO = pathO + fname; 
     System.IO.File.Move(filename, pathO); 
    } 
} 
); 

所以我除去以下行 node.ParentNode.RemoveChild(節點),不要取出並行循環內的子節點;

瞭解有關並行處理功能的任務Parallel Liberary(http://msdn.microsoft.com/en-us/library/dd537608.aspx)的更多信息。

+0

你應用的並行foreach文件名部分是針對目錄中的各種文件。我試圖在xml節點上實現它(即在各種目錄中)。我試圖在for循環上面做,但它似乎無法正常工作。 – user2038650 2013-02-13 09:14:26

+0

發送代碼你已經嘗試過 – 2013-02-13 09:18:43

+0

抱歉,延遲響應。我試着做的=> – user2038650 2013-02-14 06:03:34