资源堆栈,如果为空则等待,直到推送元素

时间:2010-06-29 00:06:59

标签: c# multithreading

我想构建一个将由不同线程使用的资源堆栈,但是希望阻止调用线程直到超时,直到资源可用。 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;
    }

2 个答案:

答案 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;
}