Как определить, ожидает ли EventWaitHandle?
-
19-09-2019 - |
Вопрос
У меня есть довольно хорошее многопоточное приложение 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
где-то из пользовательского интерфейса, и он вернет мне данные, когда LoadStuff
завершил выполнение.
Однако все это работает совершенно корректно RevTypes
это всего лишь один объект недвижимости, а на самом деле их несколько десятков.И одно или несколько из этих свойств препятствуют быстрой загрузке пользовательского интерфейса.
Если не считать размещения тестового кода в каждом свойстве, есть ли способ узнать, какое свойство удерживает загрузку пользовательского интерфейса?Есть ли способ узнать, действительно ли EventWaitHandle вынужден ждать?
Решение
Я не уверен, чего и как вы хотите достичь, но вы можете просмотреть 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);
}
}
}
}