Как запустить 2 или более потоков одновременно и заблокировать основной поток до тех пор, пока остальные потоки не будут завершены?многопоточность при блокировке основной нити
ответ
Из основной нити звоните Thread.Join
на каждой другой теме.
:
Например (EDIT Теперь вы указали C#, нет необходимости для платформы агностиком комментарий.):
Thread t1 = new Thread(FirstMethod).Start();
Thread t2 = new Thread(SecondMethod).Start();
t1.Join();
t2.Join();
Это не имеет значения, в каком порядке вы звоните Join
в, если вы только хотите подождать, пока они все закончил. (Если вы хотите продолжить, когда любой из них закончили, вы должны попасть в область ожидания ручками.)
В .NET 4.0 вы также можете получить выгоду от использования System.Threading.CountdownEvent и вызова «Сигнала» для дочерних потоков и «Подождите» в основном потоке или в Системе. Threading.Barrier и вызовите SignalAndWait для всех трех потоков. – Rick
Там хороший пример того, как сделать многопоточность в C# на MSDN
http://msdn.microsoft.com/en-us/library/aa645740(VS.71).aspx#vcwlkthreadingtutorialexample1creating
Если вы посмотрите на пример Mutex, он демонстрирует, что основной поток будет спать до тех пор, пока все дочерние потоки не будут завершены.
или даже пример Mutex;) – Gwaredd
public delegate void AsyncTask(object state);
public void Method1(object state) .....
public void Method2(object state) .....
public void RunAsyncAndWait(){
AsyncTask ac1 = new AsyncTask(Method1);
AsyncTask ac2 = new AsyncTask(Method2);
WaitHandle[] waits = new WaitHandle[2];
IAsyncResult r1 = ac1.BeginInvoke(someData , null , null);
IAsyncResult r2 = ac2.BeginInvoke(someData , null , null);
waits[0] = r1.AsyncWaitHandle;
waits[1] = r2.AsyncWaitHandle;
WaitHandle.WaitAll(waits);
}
Это работает, некоторые люди будут aruge, что если нить заканчивается первым будет ждать до бесконечности, но я старался, он работал всегда. Вы также можете указать время ожидания. И в первом параметре BeginInvoke значение передается внутри ваших методов.
Jeffry Richter of Wintellect имеет library for download, называемый библиотекой Power Threading. Я не использовал его сам, но это может быть полезно.
- 1. Обратный вызов основной нити при завершении нити
- 2. Многопоточность Java - приоритет нити
- 3. Синхронизированная многопоточность против одной нити
- 4. Задержка основной нити при запуске другого потока
- 5. Перегрузка основной нити
- 6. Нити не живы, используя многопоточность python?
- 7. Что считается перегрузкой основной нити?
- 8. Как ждать рабочей нити в основной форме?
- 9. Java - вызов метода, содержащего forloop несколько раз в течение секунды, приводит к минимальной блокировке основной нити
- 10. Обновление основной нити не работает
- 11. Как избежать голодания основной нити?
- 12. Многопоточность - создание новой нити для каждого цикла
- 13. Многопоточность для перегрузки и нити имя пусто
- 14. Java многопоточность - обнаружение автоматически заблокированной нити
- 15. C#, как только основной сон нити, все нити остановились
- 16. Trigger от нити к основной нити в XCB Loop Event
- 17. Обновление метки на основной нити не работает
- 18. System.ArgumentException при блокировке
- 19. Способ отображения кадра даже при завершении основной нити
- 20. AutoResetEvents блокировка основной нити при ожидании обработчика события
- 21. C# Моя вторая из серых при вызове из основной нити
- 22. iOS 5+ - замораживание выполнения основной нити при выполнении запроса
- 23. Показать контекстуальный NSMenu без блокировки основной нити
- 24. Как имитировать WSAEWOULDBLOCK при блокировке send()?
- 25. Run Sub с ручкой на основной нити
- 26. Устраняет ли функция opengl замораживание основной нити?
- 27. Получить основной поток из вторичной нити
- 28. java.util.Timer - процесс продолжаться, когда основной конец нити
- 29. Вызов функции MEX без блокировки основной нити
- 30. AFNetworking несколько загрузок замедления основной нити
Threading in C# для вопроса выше – user125155