如何检测的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;
}
}
然后我刚刚从UI调用.RevTypes
somewehre当LoadStuff
执行完毕,将返回的数据给我。
这一切完美的作品正确,但是RevTypes
只是一个属性 - 居然有几十这些。和一个或几个属性都阻碍了正常加载UI以快速的方式。
将基准码到每个属性的短,是有办法以查看哪个属性是从保持加载UI?有没有办法看到的EventWaitHandle是否被强制实际等待?
解决方案
我不知道是什么,以及如何你想实现的,但你可以通过与WaitHandle
的超时0
s周期,看看它们目前被设置,如:
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);
}
}
}
}
不隶属于 StackOverflow