.NETフレームワークには、オブジェクトの保持コンテナを表すクラスはありますか?

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

  •  04-10-2019
  •  | 
  •  

質問

オブジェクトの保持構造を定義するクラスを探しています。このオブジェクトの値は、このコンテナが作成されたときよりも後で設定できます。このような構造をラムダスまたはコールバック関数などに渡すと便利です。

言う:

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();
    }
}

他のヒント

あなたが達成しようとしていることは、未来のように感じます。 .NET 4.0 TPLの初期CTPにはaがありました Future<T> クラス。 .NET 4.0のRTMで変更されました 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の反応性拡張機能. 。 .NET 3.5のTPLを含むSystem.Threading.DLLアセンブリが含まれています。


一方 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