كيفية اكتشاف ما إذا كان الحدث ينتظر؟
-
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
هو مجرد عقار واحد - هناك بالفعل عدة عشرات من هذه. وواحد من هذه الخصائص أو العديد من هذه الخصائص يحملون من التحميل بطريقة سريعة.
اختصار وضع الرمز القياسي في كل خاصية، هل هناك طريقة لمعرفة العقار الذي يحمل UI من التحميل؟ هل هناك طريقة لمعرفة ما إذا كان 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);
}
}
}
}
لا تنتمي إلى StackOverflow