5
    private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 15; i++)
        {
            Thread nova = new Thread(Method);
            nova.Start();
        }
        listBox1.Items.Add("Some text");
    }

    private void Method()
    {
        for (int i = 0; i < 15; i++)
        {
            Console.WriteLine(i);
        }

    }

このコードは次のように記述します。いくつかのテキスト、次に番号111222333.....私はそれが111122223333....を書き込み、最後にいくつかのテキストを書き込むことを望みます。スレッドでそれを行うことは可能ですか(親スレッドは子スレッドを待機します)?または私は何か他のものを使用する必要がありますか?

4

4 に答える 4

15

すべてのスレッドを追跡し、Thread.Joinそれぞれで使用する必要があります。これは、指定されたスレッドが終了するまで待機してから、実行を続行します。このような:

var threads = new List<Thread>();
for (int i = 0; i < 15; i++)
{
    Thread nova = new Thread(Method);
    nova.Start();
    threads.Add(nova);
}
foreach (var thread in threads)
    thread.Join();
listBox1.Items.Add("Some text");
于 2012-06-22T16:10:29.400 に答える
10

これを行うには TPL を使用することをお勧めします。それほど多くのスレッドを生成する必要はありません。デフォルトでは、TPL はそのためにスレッド プールを使用します。

using System;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        private const int TaskCount = 15;

        static void Main(string[] args)
        {
            var tasks = new Task[TaskCount];
            for (var index = 0; index < TaskCount; index++)
            {
                tasks[index] = Task.Factory.StartNew(Method);
            }
            Task.WaitAll(tasks);

            Console.WriteLine("Some text");
        }

        private static void Method()
        {
            for (int i = 0; i < 15; i++)
            {
                Console.WriteLine(i);
            }
        }
    }
}
于 2012-06-22T16:23:55.640 に答える
1

2 つのスレッドを持つことができます。2 番目のスレッドは、最初のスレッドから発火するシグナルを待機しています。

private void Foo()
{
  var signals = new List<ManualResetEvent>();

  for (int i = 0; i < 15; i++)
  {
    var signal = new ManualResetEvent(false);
    signals.Add(signal);
    var thread = new Thread(() => { Method(); signal.Set(); });
    thread.Start();
  }

  var completionTask = new Thread(() =>
  {
    WaitHandle.WaitAll(signals.ToArray());
    CompletionWork();
  });
  completionTask.Start();

}

private void Method()
{
}

private void CompletionWork()
{
}

.Net 4.0 (およびそれ以降) でのより良い解決策は、Tasks を使用し、次を使用してメソッドを呼び出すことです。ContinueWith

private void Foo()
{
  var childThreads = new List<Task>();
  for (int i = 0; i < 15; i++)
  {
    var task = new Task(Method);
    task.Start();
    childThreads.Add(task);
  }

  var completionTask = new Task(() => 
  { 
    Task.WaitAll(childThreads.ToArray());
  }).ContinueWith(t => CompletionWork());

}

private void Method()
{
}

private void CompletionWork()
{
}

結合の回答も機能しますが、含まれているスレッドをブロックする必要があります。GUI をブロックしたくない場合は、1 番目の周り​​に追加のスレッドを生成します。

于 2012-06-22T16:13:16.660 に答える
0

thread.join を使用して、スレッドが終了するのを待つことができます。使用方法のページについては、http://www.dotnetperls.com/thread-joinを参照してください。

于 2012-06-22T16:11:17.077 に答える