我想构建一个将由不同线程使用的资源堆栈,但是希望阻止调用线程直到超时,直到资源可用。 WaitUntilTheStackHasMember()方法是我缺少的部分。我虽然使用了像MSDN timer and autoreset event中描述的方法,但它变得复杂了。
有更简单的方法吗?
Class ResStack
{
public TimeSpan TimeOut { get; set; }
private object lockSync;
private Stack<Resource> Resources;
ResStak()
{
// populate Stack
}
public void AddResource (Resource resource)
{
lock (lockSync)
{
Resource.Push(resource);
}
}
private Resource PopRes()
{
Resource res = null;
lock (lockSync)
{
if (Resources.Count > 0)
{
res = Resources.Pop();
}
else
{
WaitUntilTheStackHasMember() // Not implemented
}
}
return res;
}
答案 0 :(得分:3)
如果您可以使用.NET 4,BCL会添加一个BlockingCollection<T>
类,它可以完全满足您的需求。您可以使用ConcurrentStack<T>
构造它以实现阻塞堆栈语义。
您需要使用TryTake(out T, TimeSpan)
方法来满足超时要求。
答案 1 :(得分:0)
您的方法可以重复睡眠和测试,直到一段时间过去或资源出现。让它返回一个标志,表明它找到了资源或超时:
bool WaitUntilTheStackHasMember()
{
TimeSpan waitPeriod = TimeSpan.FromSeconds(10);
int sleepPeriod = 100; // milliseconds
DateTime startTime = DateTime.Now;
while ((Resources.Count == 0) && ((DateTime.Now - startTime) < waitPeriod))
{
System.Threading.Thread.Sleep(sleepPeriod);
}
return Resources.Count > 0;
}