-1

効率的かつ制御された方法でスレッドを動的に生成するにはどうすればよいですか? スレッドは、各 XML ホスト ID に基づいて動的に作成されます。

例:

samplethread1  for hostid:-1
samplethread2  for hostid:-2

ホスト ID カウントに依存できないため、コードを動的にする必要があります。各スレッドを制御する方法を提案してください。

サンプル XML コードの一部を考えると、次のようになります。

<?xml version="1.0" standalone="yes"?>
  <HOSTS>
     <Host id = '1'>
       <Extension>txt</Extension>
       <FolderPath>C:/temp</FolderPath>
     </Host>
     <Host id = '2'>
       <Extension>rar</Extension>
       <FolderPath>C:/Sample</FolderPath>
     </Host>
  </HOSTS>
4

2 に答える 2

4

質問が特に明確ではないことに同意する必要があります。しかし、ホストごとに新しいスレッドを作成するだけの場合は、これはどうですか? これは、.NET 4.0 Task Parallel Libraryを使用しています。.NET 4.0 以降では、これはプロセッサの同時実行機能を利用する簡単な方法です。

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

    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");
        taskFactory.StartNew(() => DoWork(hostId, extension, folderPath));
    }
    //Carry on with your other work
}

static void DoWork(int hostId, string extension, string folderPath)
{
    //Do stuff here
}

.NET 3.5 以前を使用している場合は、自分でスレッドを作成できます。

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

これは、私にとって依然としてThreading の最良のガイドです。

編集

これは、あなたがコメントで得ていると思うタスクベースのバージョンですか?

static void Main()
{
    var currentDir = Directory.GetCurrentDirectory();
    var xDoc = XDocument.Load(string.Format(Path.Combine(currentDir, "Hosts.xml")));
    var taskFactory = new TaskFactory();

    //I'm assuming this ID would normally be user input, or be passed from some other external source
    int hostId = 2;

    taskFactory.StartNew(() => DoWork(hostId, xDoc));
    //Carry on with your other work
}

static void DoWork(int hostId, XDocument hostDoc)
{
    XElement foundHostElement = (from hostElement in hostDoc.Descendants("Host")
                                    where (int)hostElement.Attribute("id") == hostId
                                    select hostElement).First();
    var extension = (string)foundHostElement.Element("Extension");
    var folderPath = (string)foundHostElement.Element("FolderPath");
    //Do stuff here
}
于 2012-06-10T14:58:52.183 に答える
1

配列の処理を維持したくない場合は、「起動して忘れる」ことができるので、「ThreadPool」を使用することをお勧めします。

ThreadPool.QueueUserWorkItem();

詳細については、http://msdn.microsoft.com/en-us/library/3dasc8as (v=vs.80).aspx を参照してください。

配列を作成したい場合は、次のようにすることができます。

List<Thread> threads = new List<Thread>();
threads.Add(new Thread()); //Create the thread with your parameters here

スレッドの作成と実行の例: http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx

于 2012-06-10T14:20:38.630 に答える