2012-05-14 3 views
3

Этот код покажет вам, как я начал несколько потоков:Как остановить многопоточный начать для условия цикла

for (int i = 0; i < 8; i++) 
{ 
    doImages = new DoImages(this, TCPPORT + i); 
    var thread = new Thread(doImages.ThreadProc); 
    thread.Name = "Imaging"; 
    var param = (i + 1).ToString();      
    thread.Start(param); 
} 

Теперь я пытаюсь остановить нити перед закрытием мое приложение, но я не знаю, как сделать это?

+0

Вам нужно сохранить объект, который отслеживает потоки внутри вашего класса. Внедрите метод Dispose для вашего класса, который убивает отслеживаемые потоки, и вы должны быть в порядке. – JamieSee

+1

«Теперь я пытаюсь остановить потоки перед закрытием приложения, но я не знаю, как это сделать?» - Вы пытались не останавливать их? Что действительно плохо происходит, если вы не останавливаете их, не называйте Thread.Join(), не сигнализируйте им, чтобы они останавливались, ничего не делали? –

ответ

2

Один простой вариант для хранения ссылок на все потоки, которые вы икру, а затем присоединиться все из них, когда вы сделали:

Thread[] threads = new Thread[8]; 
for (int i = 0; i < 8; i++) 
{ 
    doImages = new DoImages(this, TCPPORT + i); 
    var thread = new Thread(doImages.ThreadProc); 
    threads[i] = thread; 
    thread.Name = "Imaging"; 
    var param = (i + 1).ToString();      
    thread.Start(param); 
} 
for (int i = 0; i < 8; i++) 
{ 
    threads[i].Join(); 
} 

Это будет ждать всех потоков закончить до применения завершается.

+0

Спасибо за ваш ответ. Не весь успех вашего кода, но я использую ваш массив нитей, чтобы остановить мои потоки по петлям над каждым из элементов потока. и я создаю массив класса DoImages для STOP. – TuanTDA

0

Вы можете использовать thread.Abort();, если вы сохраняете ссылки на объекты потока и просто хотите выйти из своего приложения.

Я предполагаю, что вы хотите завершить выполнение, а затем закрыть приложение. Для этого вам нужно синхронизировать свои потоки с помощью Join() или другого метода синхронизации.

+0

Но Thread.Abort() обычно следует избегать. Так как это все-таки выход из процесса, его можно использовать. –

2

Чистейший и самый надежный способ, чтобы сделать их фон темой:

for (int i = 0; i < 8; i++) 
{ 
    doImages = new DoImages(this, TCPPORT + i); 
    var thread = new Thread(doImages.ThreadProc); 
    thread.Name = "Imaging"; 
    var param = (i + 1).ToString(); 
    thread.IsBackground = true;   // ** 
    thread.Start(param); 
} 

Фоновых нити автоматически прекращается, когда процесс (основной поток) покидает.

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