2010-06-29 3 views
0

Я хочу создать стек ресурсов, которые будут использоваться разными потоками, но хотят блокировать поток вызовов до таймаута, пока ресурс не станет доступным. Метод 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; 
    } 

ответ

3

Если вы можете использовать .NET 4, BCL добавил BlockingCollection<T> класс, который делает именно то, что вам нужно. Вы можете построить его с помощью ConcurrentStack<T>, чтобы добиться блокировки стека семантики.

Вы должны использовать метод TryTake(out T, TimeSpan) для ваших требований к таймауту.

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; 
} 
Смежные вопросы