-1

在查看控制台时,这两个代码块是否具有相同的效果?
请注意:目前我仍在使用并绑定到 .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 会随着每个信号而增加吗?循环会一直运行到所有信号都完成吗?或者当线程已经在工作时会忽略信号吗?

有人可以为此带来一些启示吗?

4

1 回答 1

3

由于您使用的是ManualResetEvent,因此一旦您发出事件信号,它就会保持信号状态,直到它被重置。这意味着设置一次或三次将具有相同的效果。

这也意味着工作人员将进入无限循环,因为事件永远不会重置。

此外,您不能锁定值类型。如果可以的话, int 将被装箱并在object每次锁定它时创建一个新的 - 这意味着您每次都会锁定一个不同的对象,从而使锁无用。

于 2014-07-10T09:58:12.387 回答