WaitHandle的基本行为

时间:2014-07-10 09:51:47

标签: c# multithreading asynchronous threadpool waithandle

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

有人可以为此提供一些启示吗?

1 个答案:

答案 0 :(得分:3)

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

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

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