-2

xmlを読み取るサービスを作成しました。xmlには、入力ディレクトリと出力ディレクトリがあります。サービスは、入力ディレクトリ内のファイルを選択して名前を変更し、出力ディレクトリに移動します。サービスにスレッドを実装したい。1つのスレッドでxmlの1つのノードを選択し、もう1つのスレッドで他のノードを選択するようにします。または、ノードに関係なく、1つのスレッドが実行する最初の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);

                }
            } 
4

1 に答える 1

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(node);を削除しました。

提供されている並列処理機能については、Task Parallel Liberary(http://msdn.microsoft.com/en-us/library/dd537608.aspx )の詳細をご覧ください。

于 2013-02-13T08:58:59.857 に答える