2014-08-10 2 views
3

Я начинаю узнавать про потоки, и я написал этот код.Одна нить приостановка

static void Main(string[] args) 
{ 
    Thread DoAction = new Thread(StartAction); 
    DoAction.Start(); 
    for (int i = 0; i < 10000000; i++) 
    { 
     Console.WriteLine("Main Thread: {0}", i); 
     if (i == 10000) DoAction.Suspend(); 
    } 
} 

static void StartAction() 
{ 
    for(int i=0;i<int.MaxValue;++i) 
    { 
     Console.WriteLine(i); 
    } 
} 

Когда i == 10000 мое приложение остановилось. Я хочу приостановить только DoAction Thread

+1

Это устаревший API, который вы не должны использовать. Я предлагаю вам потратить ваше время более выгодно на изучение API, которые * не были устаревшими или, еще лучше, абстракциями более высокого уровня, такими как задачи. –

+0

Спасибо. Я следую вашим советам – user3926523

+1

Вы можете использовать этот тип кода, чтобы получить некоторое представление о потоковой передаче в целом (этот вопрос является хорошим примером), но Джон прав, ничто из этого не должно появляться в производственном коде. –

ответ

5

Консоль - это «поточно-безопасный» класс, означающий, что acces регулируется внутри с помощью замков.

С небольшой (плохой) удачей вы приостановите рабочий поток посередине WriteLine(). Ваш основной поток затем приостанавливается, когда он пытается писать, и вы зашли в тупик.

3

Thread.Suspend почти всегда небезопасен. Здесь вы, вероятно, приостановите всю консоль. Представьте, что вы приостановили статический конструктор system.string (случайно). Весь AppDomain быстро остановился.

Используйте некоторые другие средства для синхронизации ваших потоков.

+0

Я бы ожидал, что такой специальный конструктор будет обрабатываться специально (как защищенная область или что-то еще). Но ваша точка зрения. –

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