3

我有一个相当不错的多线程 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 调用somewehre,它会在完成执行 .RevTypes后将数据返回给我。LoadStuff

所有这些都可以正常工作,但RevTypes只是一个属性 - 实际上有几十个。这些属性中的一个或几个正在阻止 UI 快速加载。

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

4

1 回答 1

3

我不确定您希望实现什么以及如何实现,但您可以在WaitHandles中循环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);
            }
        }
    }
}
于 2010-03-13T00:10:27.667 回答