#c# #.net #multithreading
#c# #.net #многопоточность
Вопрос:
я хочу запустить 6 потоков асинхронно, приостановить их и возобновить синхронно…
он должен работать так:
- Запуск потока 1 (thr1.start())
- Поток 1 некоторый прогресс (получение mac-адресов из txt-файла, инициализация com-объектов)
- Поток 1 приостановлен (приостановлен до тех пор, пока все потоки не выполнят то же самое, что и поток 1)
- Запуск потока 2
- Поток 2 некоторый прогресс
- Поток 2 приостановлен
- Запуск потока 3
- Поток 3 некоторый прогресс
- Поток 3 приостановлен
- …
- после того, как все 6 потоков приостановлены, они должны возобновить все..
я попробовал с 6 простыми логическими флагами и подождал, пока все они true
не станут совсем грязными…
есть идеи?
РЕДАКТИРОВАТЬ (улучшенная визуализация):
Thr1 | Initiliazing |waiting |waiting | Resuming
Thr2 | waiting |Initiliazing |waiting | Resuming
Thr3 | waiting |waiting |Initiliazing | Resuming
...
спасибо и приветствую,
flux
Комментарии:
1. какова ваша проблемная область — может быть, есть какой-то другой способ ее решения
2. почему бы просто не выполнить все 6 из
some progress
вашего основного потока, а затем создать дополнительные потоки?3. потому
some progress
что это должно быть в каждом потоке .. есть некоторые проблемы с сообщениями, если я инициализирую своиsome progress
объекты в main4. они не могут быть инициализированы одновременно.. есть некоторые dll-вызовы, которые не могут быть одновременно.. итак, мне нужно подождать … я отредактировал вопрос
5. Я думаю, люди спрашивают: «Какую работу будут выполнять ваши потоки?»
Ответ №1:
Вам нужна какая-то синхронизация — вероятно, звучит ManualResetEvent для каждого потока, в зависимости от функций вашего потока.
РЕДАКТИРОВАТЬ: Спасибо за ваши обновления — вот простой пример:
// initComplete is set by each worker thread to tell StartThreads to continue
// with the next thread
//
// allComplete is set by StartThreads to tell the workers that they have all
// initialized and that they may all resume
void StartThreads()
{
var initComplete = new AutoResetEvent( false );
var allComplete = new ManualResetEvent( false );
var t1 = new Thread( () => ThreadProc( initComplete, allComplete ) );
t1.Start();
initComplete.WaitOne();
var t2 = new Thread( () => ThreadProc( initComplete, allComplete ) );
t2.Start();
initComplete.WaitOne();
// ...
var t6 = new Thread( () => ThreadProc( initComplete, allComplete ) );
t6.Start();
initComplete.WaitOne();
// allow all threads to continue
allComplete.Set();
}
void ThreadProc( AutoResetEvent initComplete, WaitHandle allComplete )
{
// do init
initComplete.Set(); // signal init is complete on this thread
allComplete.WaitOne(); // wait for signal that all threads are ready
// resume all
}
Обратите внимание, что StartThreads
метод будет блокироваться во время инициализации потоков — это может быть или не быть проблемой.
Комментарии:
1. можете ли вы привести мне небольшой пример? я понятия не имею, как это реализовать с помощью этого события: ( приветствия
2. Не могли бы вы отредактировать свой вопрос и дать некоторое представление о том, что делают ваши потоки, — тогда я мог бы дать более конкретный ответ.
3. вау , спасибо … похоже, именно то, что я ищу! я постараюсь дать обратную связь! БОЛЬШОЕ СПАСИБО!
4. Нет проблем — не стесняйтесь задавать любые другие вопросы, если вы застряли.