2009-06-08 4 views
4

Я использую .NET (C#).Проснувшись один поток от другого

, если у меня есть 2 потоков, выполняющихся T1 и T2 и T1, как это:

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

в то же время T2 делает что-то совершенно другое, однако время от времени он должен дать T1 удар такой, что он просыпается от сна, хотя время сна не вверх. Как мне это сделать?

+0

, кстати, даже если Т1 будить перед истечением 5 секунд, вы не совсем уверены, что T1 привлечет внимание планировщика до конца этих 5 секунд. Не слишком полагайтесь на подобные предположения! Скорее всего, просыпание Thread ранее позволит сделать работу раньше ... но это может произойти или не произойти. – NicDumZ

ответ

12

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

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

private ManualResetEvent myEvent = new ManualResetEvent(false); 

thread1:

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

thread2:

myEvent.Set(); 

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

EDIT: добавлено AutoResetEvent выше

+1

В этом случае может быть лучше использовать «AutoResetEvent», так что вопросы типа «что произойдет, если сигналы T2 сразу после WaitOne?» не нужно отвечать ... – jerryjvl

+0

Согласовано. AutoResetEvent, вероятно, проще. –

0

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

Если вы хотите, чтобы GOOGLE больше информации об этом, вы можете захотеть найти для «потоковой сигнализации» в .NET или что-то в этом роде.

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