هل هناك أي فئة في إطار .NET لتمثيل حاوية عقد للكائنات؟

StackOverflow https://stackoverflow.com/questions/2796674

  •  04-10-2019
  •  | 
  •  

سؤال

أنا أبحث عن فصل يحدد بنية الحجز لكائن. يمكن تعيين قيمة هذا الكائن في وقت لاحق من إنشاء هذه الحاوية. من المفيد تمرير مثل هذا الهيكل في Lambdas أو في وظائف رد الاتصال وما إلى ذلك.

يقول:

class HoldObject<T> {
 public T Value { get; set; }
 public bool IsValueSet();
 public void WaitUntilHasValue();
}

// and then we could use it like so ...

HoldObject<byte[]> downloadedBytes = new HoldObject<byte[]>();
DownloadBytes("http://www.stackoverflow.com", sender => downloadedBytes.Value = sender.GetBytes());

من السهل تحديد هذا الهيكل ، لكنني أحاول معرفة ما إذا كان أحدهم متاحًا في FCL. أريد أيضًا أن يكون هذا هيكلًا فعالًا يحتوي على جميع الميزات المطلوبة مثل سلامة الخيط والانتظار الفعال وما إلى ذلك.

أي مساعدة يحظى بتقدير كبير.

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

المحلول

لم ير فصلًا من هذا القبيل ، ولكن يجب أن يكون بسيطًا جدًا.

public class ObjectHolder<T>
{
    private T value;
    private ManualResetEvent waitEvent = new ManualResetEvent(false);

    public T Value
    {
        get { return value; }
        set
        {
            this.value = value;

            ManualResetEvent evt = waitEvent;

            if(evt != null)
            {
                evt.Set();
                evt.Dispose();
                evt = null;
            }
        }
    }

    public bool IsValueSet
    {
        get { return waitEvent == null; }
    }

    public void WaitUntilHasValue()
    {
        ManualResetEvent evt = waitEvent;

        if(evt != null) evt.WaitOne();
    }
}

نصائح أخرى

ما تحاول إنجازه يبدو وكأنه مستقبل. كان CTP في وقت مبكر من .NET 4.0 TPL Future<T> صف دراسي. مع RTM من .NET 4.0 تم إعادة تسميته إلى Task<T>. إذا قمت بالقلق ، يمكنك رؤية التشابه بين:

class HoldObject<T>
{
    public T Value { get; set; }
    public bool IsValueSet();
    public void WaitUntilHasValue();
}

و

class Task<T>
{
    public T Value { get }
    public bool IsCompleted { get; }
    public void Wait();
}

إذا كنت لا تستخدم .NET 4.0 حتى الآن ، يمكنك تنزيل الامتدادات التفاعلية لـ .NET 3.5SP1. أنه يحتوي على مجموعة System.Threading.dll التي تحتوي على TPL لـ .NET 3.5.


بينما ال Value هو القراءة فقط ، يمكن أن يتم تغييره بالطبع من خلال قيمة إرجاع المندوب الذي تقوم بتوفيره للمهمة. بالطبع لست متأكدًا تمامًا مما إذا كان هذا يفي بمتطلباتك ، ولكن يمكن كتابة مثالك على النحو التالي:

var downloadBytesTask = Task<byte[]>.Factory.StartNew(() => 
    DownloadBytes("http://www.stackoverflow.com"));

if (!downloadBytesTask.IsCompleted)
{
    downloadBytesTask.Wait();
}

var bytes = downloadBytesTask.Value;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top