Как определить, ожидает ли EventWaitHandle? - PullRequest
3 голосов
/ 13 марта 2010

У меня есть довольно хорошее многопоточное приложение 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;
    }
}

Затем я просто вызываю .RevTypes somewehre из пользовательского интерфейса, и он вернет мне данные, когда LoadStuff завершит выполнение.

Все это работает совершенно правильно, однако RevTypes - это всего лишь одно свойство - на самом деле их несколько десятков. И одно или несколько из этих свойств удерживают пользовательский интерфейс от быстрой загрузки.

Если не поместить код теста в каждое свойство, есть ли способ узнать, какое свойство удерживает пользовательский интерфейс от загрузки? Есть ли способ узнать, действительно ли EventWaitHandle вынужден ждать?

1 Ответ

3 голосов
/ 13 марта 2010

Я не уверен, чего и как вы хотели бы достичь, но вы можете циклически проходить через 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);
            }
        }
    }
}
...