我有一个相当不错的多线程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是否被迫实际等待?
答案 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);
}
}
}
}