线程为Windows服务

时间:2013-02-13 08:44:50

标签: c# multithreading windows-services

我已经创建了一个读取xml的服务。在xml中我有输入目录和输出目录。该服务选择输入目录中的文件并重命名它们并将它们移动到输出目录。我想在服务中实现线程。我希望它在一个线程中选择一个xml节点而在另一个线程中选择另一个节点。或者,如果不考虑节点,一个线程选择要执行的前10个操作,接下来的10个操作,依此类推甚至是好的,依此类推。这样所有节点都以并行方式处理。谁可以帮我这个事?我尝试阅读一些线程教程,但通过它们无法获得太多。服务代码如下:

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);

                }
            } 

1 个答案:

答案 0 :(得分: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);
    }
}
);

不要删除Parallel循环中的子节点,所以我删除了以下行         node.ParentNode.RemoveChild(节点);

了解有关任务并行解放(http://msdn.microsoft.com/en-us/library/dd537608.aspx)的更多信息,了解并行处理功能。