如何检测EventWaitHandle是否在等待?

时间:2010-03-12 23:26:19

标签: performance multithreading .net-2.0 c#-3.0 event-wait-handle

我有一个相当不错的多线程winforms应用程序,它在许多地方使用EventWaitHandle来同步访问。

所以我的代码与此相似:

List<int> _revTypes;
EventWaitHandle _ewh = new EventWaitHandle(false, EventResetMode.ManualReset);

void StartBackgroundTask() {
    _ewh.Reset();
    Thread t = new Thread(new ThreadStart(LoadStuff));
    t.Start();
}

void LoadStuff() {
    _revTypes = WebServiceCall.GetRevTypes()
    // ...bunch of other calls fetching data from all over the place
    // using the same pattern
    _ewh.Set();
}


List<int> RevTypes {
    get {
        _ewh.WaitOne();
        return _revTypes;
    }
}

然后我只是从UI调用.RevTypes,它会在LoadStuff执行完毕后向我返回数据。

所有这一切都非常正确,但是RevTypes只是一个属性 - 实际上有几十个属性。并且这些属性中的一个或多个阻止了UI以快速方式加载。

没有将基准代码放入每个属性,有没有办法看到哪个属性正在加载UI?有没有办法看看EventWaitHandle是否被迫实际等待?

1 个答案:

答案 0 :(得分:3)

我不确定您希望实现什么以及如何实现,但您可以在WaitHandle超时0的情况下循环查看它们当前是否已设置,例如:

class Program
{
    static void Main(string[] args)
    {
        EventWaitHandle[] waitHandles = new EventWaitHandle[3];
        for (int i = 0; i < 3; i++)
        {
            waitHandles[i] = new EventWaitHandle(false, EventResetMode.ManualReset);
        }
        waitHandles[1].Set();

        for (int i = 0; i < 3; i++)
        {
            if (waitHandles[i].WaitOne(0))
            {
                Console.WriteLine("Handle {0} is set", i);
            }
            else
            {
                Console.WriteLine("Handle {0} is not set", i);
            }
        }
    }
}