سؤال

لسبب ما، ThreadPool QueueWorkItem للا يقوم بإرجاع IAsyncResult أو بعض مقبض آخر لعنصر العمل، والتي من شأنها أن تسمح للانتظار حتى يتم الانتهاء منه. هناك طرق RegisterWait...، ولكن لديك لتمرير WaitHandle وخلق منها غير مكلفة (راجع وثائق IAsyncResult التي تقدم المشورة لك لتأخير خلق WaitHandle حتى طلب). سوف مكتبة موازية مهمة إصلاح هذا النقص، ولكن هناك انتظار طويل قبل ما هو متاح. لذلك، هل هناك أي مشاكل مع هذا التصميم:

public class Concurrent<T> {
    private ManualResetEvent _resetEvent;
    private T _result;

    public Concurrent(Func<T> f) {
        ThreadPool.QueueUserWorkItem(_ => {
                                         _result = f();
                                         if (_resetEvent != null)
                                             _resetEvent.Set();
                                     });
    }

    public WaitHandle WaitHandle {
        get {
            if (_resetEvent == null)
                _resetEvent = new ManualResetEvent(_result != null);
            return _resetEvent;
        }

    ...

وتحرير: سألت المتابعة سؤال حول المخاوف التي تنشأ عند استخدام المندوبين المتزامن بدلا من ThreadPool .

هل كانت مفيدة؟

المحلول

حسنا، كنت قد حصلت على حالة تعارض بين جلب WaitHandle ووضع عليه. هل تريد حقا المتصل أن ينتظر إلى الأبد إذا كانوا موجودين ليكون القليل في وقت متأخر؟

وربما يجب عليك القيام ببعض قفل المناسب والحفاظ على وقال "لقد انتهى" العلم بحيث إذا كان ل<م> قيام خلق WaitHandle بعد الانتهاء من ذلك، يمكنك تعيين ذلك قبل إعادته.

وكنت أيضا شخصيا الكتابة أسلوب مصنع ثابت بدلا من مجرد استخدام منشئ العام - أو جعله "إنشاء و<م> ثم بدء صراحة" النمط. الطابور عنصر العمل في منشئ تشعر أنها غريبة بالنسبة لي.

نصائح أخرى

لماذا لا يتم استخدام مندوب غير متزامن، كما demostrated هنا:

http://msdn.microsoft.com/en-us/library /h80ttd5f.aspx

وهذا من شأنه أن يجعل بالتزامن عفا عليها الزمن، أليس كذلك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top