在查看控制台时,这两个代码阻止相同的效果吗? 请注意:目前我仍在使用并绑定到.NET 3.5。
第一:
for(int i = 0; i<3;i++)
{
Console.WriteLine(i);
}
第二
class Worker
{
static int i = 0;
static ManualResetEvent manualResetEvent = new ManualResetEvent(false);
static Object locky = new Object();
static void Work(Object workItem)
{
WaitHandle[] wait = new [] { manualResetEvent };
while (WaitHandle.WaitAny(wait))
{
lock (locky)
{
Console.WriteLine(i++);
}
}
}
}
// main:
Thread thread = new Thread(Worker.Work);
thread.Start();
for (int i=0;i<3;i++)
{
Worker.manualResetEvent.Set();
}
waitHandle会随着每个信号而增加吗?循环会运行直到所有信号都完成吗? 或者当线程已经工作时,是否会忽略信号?
有人可以为此提供一些启示吗?
答案 0 :(得分:3)
由于您使用的是ManualResetEvent
,因此一旦您发出事件信号,它就会一直发出信号,直到它被重置为止。这意味着设置一次或三次将产生相同的效果。
这也意味着工作人员将进入无限循环,因为事件永远不会重置。
此外,您无法锁定值类型。如果可以的话,int将被装箱并在每次锁定时创建一个新的object
- 这意味着你每次都要锁定一个不同的对象,这使得锁无用。