我有一个通过AutoResetEvent
同步线程的代码。
基本上有两个线程交替控制并执行命令,每次只能有一个线程执行。
代码:
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...
然而,当我转移到
任务
时:Task.Run(()=>Waiter());
Task.Run(()=>Waiter2());
我有时会遇到以下问题:
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
的顺序与我调用它们的顺序相同?