2013-02-13 2 views
-2

Я сделал сервис, который читает xml. В xml у меня есть каталог ввода и выходной каталог. Служба выбирает файлы в каталоге ввода и переименовывает их и перемещает их в выходной каталог. Я хочу реализовать потоки в службе. Я хочу, чтобы он выбирал один узел xml в одном потоке, а другой в другом. Или было бы хорошо, если независимо от узлов один поток выбирает первые 10 операций, которые будут выполняться, а следующий следующий 10 и так далее. Так что все узлы обрабатываются параллельно. Может ли кто-нибудь помочь мне в этом? Я пробовал читать несколько учебников по потокам, но не смог их получить. Код сервиса выглядит следующим образом:Threading для службы 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 помочь вам –

ответ

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

+0

отправьте код, что вы пробовали –

+0

извините за задержку ответа. что я пробовал делать => – user2038650

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