0

ここでは、各属性IDのxmlドキュメントを読み取って動的スレッドを生成しようとしていますが、特定の属性の関連要素である動的スレッドにパラメーターを渡す方法にパラメーターを送信する方法があるという問題に直面していますか?ご意見をお聞かせください

以下のスレッドでは、doworkメソッドを呼び出していますが、特定の属性IDの要素のパラメーターを渡す必要があります。どうすればよいですか?

static void Main(string[] args)
{
var currentDir = Directory.GetCurrentDirectory();
var xDoc = XDocument.Load(string.Format(Path.Combine(currentDir, "Hosts.xml")));
var threads = new List<Thread>();

foreach (XElement host in xDoc.Descendants("Host"))
{
    var hostID = (int) host.Attribute("id");
    var extension = (string) host.Element("Extension");
    var folderPath = (string) host.Element("FolderPath");
    var thread = new Thread(DoWork)
                     {
                         Name = string.Format("samplethread{0}", hostID)
                     };
    thread.Start(new FileInfo
                     {
                         HostId = hostID,
                         Extension = extension,
                         FolderPath = folderPath
                     });
    threads.Add(thread);
    }
   //Carry on with your other work, then wait for worker threads
   threads.ForEach(t => t.Join());
}

   static void DoWork(object threadState)
     {
       var fileInfo = threadState as FileInfo;
            if (fileInfo != null)
             {
               //Do stuff here
             }
      }

      class FileInfo
         {
           public int HostId { get; set; }
           public string Extension { get; set; }
           public string FolderPath { get; set; }
         }

スレッド内で複数のパラメーターを受け取るメソッドを呼び出すにはどうすればよいですか。私はというメソッドを持っています

 Send(string arg1, string arg2, string arg3)

それが、パラメータを渡すための解決策を皆さんに求めた理由です。ここで、私のスレッド化の方法論は動的な方法で設計されていることに注意してください。何か提案がありますか?

4

2 に答える 2

0

あなたはすでにパラメータをうまく渡しています。あなたの質問を理解できるかどうかはわかりませんが

特定の属性IDの要素のパラメーターを渡す必要があります。どうすればよいですか?

必要なのはif statementあなたの内部だけのようforeachです。すでにループしてスレッドを作成している/パラメータを渡している。各アイテムに特定の属性IDがあることを確認する方法を尋ねているだけですか?もしそうなら-それを作るだけ

foreach (XElement host in xDoc.Descendants("Host"))
{
    var hostID = (int) host.Attribute("id");
    // Check ID here
    if(hostID != ID_I_WANT) 
        continue;
    var extension = (string) host.Element("Extension");
    var folderPath = (string) host.Element("FolderPath");
    var thread = new Thread(DoWork)
                     {
                         Name = string.Format("samplethread{0}", hostID)
                     };
    thread.Start(new FileInfo
                     {
                         HostId = hostID,
                         Extension = extension,
                         FolderPath = folderPath
                     });
    threads.Add(thread);
    }
   //Carry on with your other work, then wait for worker threads
   threads.ForEach(t => t.Join());
}
于 2012-06-11T07:38:30.127 に答える
0

独自のスレッドを開始するのではなく、TPLを使用できますか?

もしそうなら、あなたはこれを行うことができます:

xDoc.Descendants("Host").AsParallel().ForAll(host =>
{
    DoWork(new FileInfo
    {
        HostId = (int)xe.Attribute("id"),
        Extension = (string)xe.Element("Extension"),
        FolderPath = (string)xe.Element("FolderPath"),
    });
});

それとも、この質問の要点を見逃しましたか?

于 2012-06-11T07:51:58.117 に答える