سؤال

لدي تطبيق 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);
            }
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top