просыпаться одна нить от другой - PullRequest
4 голосов
/ 08 июня 2009

Я использую .NET (C #).

если у меня 2 потока, работающих под T1 и T2, а T1 выглядит так:

while (true) 
{
  dosomething(); //this is a very fast operation
  sleep(5 seconds);
}

в то же время Т2 делает что-то совершенно иное, однако время от времени ему нужно дать Т1 удар, чтобы он проснулся от сна, даже если время сна не истекло. Как мне это сделать?

Ответы [ 2 ]

12 голосов
/ 08 июня 2009

Используйте WaitHandle, например ManualResetEvent (или AutoResetEvent ).

В вашем классе объявите ManualResetEvent:

private ManualResetEvent myEvent = new ManualResetEvent(false);

Резьба1:

while(true) {
    doSomething();
    myEvent.WaitOne(5000);
    myEvent.Reset();
}

Резьба2:

myEvent.Set();

Thread1 будет ждать 5 секунд или пока не будет установлено значение ManualResetEvent, в зависимости от того, что наступит раньше.

РЕДАКТИРОВАТЬ : добавлен AutoResetEvent выше

0 голосов
/ 08 июня 2009

Если вы хотите это сделать, не усыпляйте свою нить. Взгляните на этот ТАК вопрос. Кроме того, эта запись в блоге кажется многообещающей.

Если вы хотите получить от Google дополнительную информацию, вы можете поискать «сигнализацию потоков» в .NET или что-то в этом роде.

...