У меня есть код, который синхронизация потоков с помощью AutoResetEvent
резьбы и планирование Задачи
В основном есть два потока, которые SWAP управления и выполнение команд, каждый поток одновременно.
Код:
static EventWaitHandle _waitHandle = new AutoResetEvent(false);
static void Waiter()
{
_waitHandle.WaitOne();
Console.WriteLine("A...");
_waitHandle.Set();
_waitHandle.WaitOne();
Console.WriteLine("A2...");
_waitHandle.Set();
}
static void Waiter2()
{
_waitHandle.WaitOne();
Console.WriteLine("B...");
_waitHandle.Set();
_waitHandle.WaitOne();
Console.WriteLine("B2...");
}
void Main()
{
new Thread(Waiter).Start();
new Thread(Waiter2).Start();
_waitHandle.Set(); // Wake up the Waiter.
}
Результат: (Я всегда получаю этот результат)
A...
B...
A2...
B2...
Однако - когда я перехожу к Tasks
:
Task.Run(()=>Waiter());
Task.Run(()=>Waiter2());
я иногдаget:
B...
A...
B2...
Это понятно для меня, потому что планировщик задач запланировал вторую задачу выполнить в первую очередь.
Что приводит меня спросить:
Вопросы
1) Есть ли нити заказать гарантированно будет такой же, как порядок вызова в:
new Thread(Waiter).Start();
new Thread(Waiter2).Start();
//In other words , will I always get the first result ?
2) Как можно заставить Task.Run
s для вызова того же порядка, что и я их вызываю?
Порядок исполнения не гарантируется. Кроме того, это очень плохая идея, чтобы несколько потоков ожидали того же 'AutoResetEvent', подумайте об этом ... [This] (http://blog.mikejmcguire.com/2014/12/22/using-the-autoresetevent -class-to-wake-multiple-threads-in-c /) является хорошим чтением. –
@WouterHuysentruit Спасибо. –