.NET框架中是否有任何类代表对象的固定容器?
-
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();
}
}
其他提示
您要完成的工作感觉很像未来。 .NET 4.0 TPL的早期CTP有一个 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的反应性扩展. 。它包含一个system.threading.dll组件,其中包含.net 3.5的tpl。
而
Value
仅阅读,更改它当然可以通过您提供任务的代表的返回值来完成。当然,我不确定这是否满足您的要求,但是您的示例可以如下写:
var downloadBytesTask = Task<byte[]>.Factory.StartNew(() =>
DownloadBytes("http://www.stackoverflow.com"));
if (!downloadBytesTask.IsCompleted)
{
downloadBytesTask.Wait();
}
var bytes = downloadBytesTask.Value;
不隶属于 StackOverflow