2012-06-22 5 views
3
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 .... а затем на конце какой-то текст. можно ли это сделать с помощью потоков (родительский поток ждать дочерних потоков)? или я должен использовать что-то еще?Подождите нити для завершения

+0

Почему вы используете потоки для этого? Я предполагаю, что это надуманный пример, но мне нужна дополнительная информация, чтобы дать вам точный ответ. –

+0

Возможный дубликат [C#: Ожидание завершения всех потоков] (http://stackoverflow.com/questions/263116/c-waiting-for-all-threads-to-complete) – Alan

+0

Нет, это просто пример. Мне нужно получить доступ к неизвестному количеству веб-страниц. и все они читают такую ​​же информацию и хранят ее в базе данных. поэтому, когда все потоки закончены, мне нужно что-то сделать с этой информацией. я ничего не могу сделать, пока у меня не будет всей информации, необходимой мне – Car90

ответ

8

Я предлагаю использовать 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); 
      } 
     } 
    } 
} 
14

Вам необходимо отслеживать все темы и использовать 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"); 
0

Вы можете использовать thread.join, чтобы ждать окончания потоков. См. http://www.dotnetperls.com/thread-join на странице о том, как его использовать.

1

У вас может быть две нити, вторая из которых ждет сигнала, чтобы стрелять из первого.

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 (и выше) является использование задач, и вызвать метод с использованием 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() 
{ 
} 

Джойна ответов также работает, но требует, содержащей нити, чтобы заблокировать , Если вы не хотите, чтобы графический интерфейс блокировался, создайте дополнительный поток вокруг 1-го.

+0

в примере ManualResetEvent, вы, кажется, ничего не добавили в список сигналов. Он будет пустым. –

+0

@ GarrGodfrey добавил сигнал в список сигналов, спасибо – payo

Смежные вопросы