2013-11-02 2 views
1

Я пытаюсь изучить потоки в C#, прямо сейчас на самом новичком уровне. Я написал код ниже, чтобы понять, как можно приостановить поток.Приостановить поток в C#: Ошибка

Но я получаю исключение «ThreadStateException были необработанными: Тема не running.It не может быть приостановлен»

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 

namespace Thread_Suspend 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Thread obj = new Thread(Function1); 
     Console.WriteLine("Threading Starts..\n"); 
     obj.Start(); 
     Thread.Sleep(2000); 
     obj.Suspend();//Exception at this line of code 
     Console.WriteLine("Thread suspended"); 
    } 
    static void Function1() 
    { 
     for (int i = 0; i < 5; i++) 
     { 
      Console.WriteLine("Thread displayed for: " + i + "time"); 
     } 
     Console.WriteLine("\nThreading done"); 
    } 
} 
} 

Я понимаю, что когда консоль печатает «Thread отображается» в 5 раз, поток перейдет спать в течение 2000 миллисекунд, после чего он перейдет в приостановленное состояние, но этого не произойдет. Я уверен, что здесь отсутствует ключевая концепция. Кроме того, я использую VS 2010 с .NET 4.0 в качестве целевой среды. Эксперты, пожалуйста, руководствуйтесь здесь. Любая помощь будет высоко оценена.

С уважением

Анураг

ответ

3

Я понимаю, что когда консоль печатает 'Thread отображается' 5 раз, поток будет идти спать в течение 2000 миллисекунд,

Нет Когда нить печатает «5 раз», а затем «Threading done», она прекратится и перестанет существовать. Сообщение об ошибке жалуется, что вы не можете приостановить то, что больше не существует.

Что ложится спать с Thread.Sleep(2000) - это ваш основной поток: он запускает вторую нить, затем переходит спать на 2 секунды. Это много времени, когда второй поток завершил цикл 5-итераций, поэтому к тому времени, когда основной поток возобновится и вызовет obj.Suspend, второй поток уже давно мертв.

+0

Привет, Джон, Спасибо за ответ. Как я могу приостановить поток в приведенном выше примере? – Anurag

+0

Вы должны 'Sleep()' в 'Function1'. Поток все равно будет жив, потому что он все равно будет выполнять этот метод. –

+0

@RobertHarvey: Если поток хочет приостановить себя, он называет «Сон» сам по себе, как говорит Роберт. Если основной поток хочет приостановить второй поток, то, очевидно, второй поток должен быть запущен в этой точке. Удаление «сна» изнутри «Main», скорее всего, сделает это, но это не очень хорошее решение, потому что тогда у вас есть состояние гонки. Я не могу сказать, чего вы пытаетесь достичь. Если вы хотите, чтобы свиной свиной грипп, просто заставьте его запустить бесконечный цикл. – Jon

0

Нить приостановлена ​​автоматически, как только она закончит работу. В вашем случае он выполняет функцию 1 очень быстро и автоматически приостанавливается.

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