【发布时间】:2016-01-02 18:28:45
【问题描述】:
我有一个通过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...
但是 - 当我搬到 Tasks 时:
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.Runs 以与我调用它们相同的顺序被调用?
【问题讨论】:
-
不保证执行顺序。此外,让多个线程等待同一个
AutoResetEvent是一个非常糟糕的主意,请考虑一下……This 是一本好书。 -
@WouterHuysentruit 谢谢。
标签: c# multithreading