كشف أن WorkItem ThreadPool أكملت / انتظار الانتهاء
-
03-07-2019 - |
سؤال
لسبب ما، 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
وهذا من شأنه أن يجعل بالتزامن عفا عليها الزمن، أليس كذلك؟