Coś takiego (pisane z palca, bez środowiska, więc potraktuj to jako pseudokod):
//klasa operująca na danych
class MyData
{
static Object mLock = new Object();
static Stack<int> mStack = new Stack<int>(); //jest jakaś taka klasa w C#
public static void AddToStack(int value)
{
lock(mLock)
{
mStack.Push(value);
}
StackListener.GetInstance.ItemAdded();
}
public static int GetFromStack()
{
lock(mLock)
{
return mStack.Pop();
}
}
public static bool StackIsEmpty()
{
return mStack.Length == 0;
}
}
//ten manager - zarządzacz
class StackListener
{
//to jest singleton, nie opisuję, jak się tworzy singleton. Ale nie musi być singletonem
Thread th = new Thread(DoWork);
void DoWork()
{
while(!MyData.StackIsEmpty())
{
int item = MyData.GetFromStack();
//tutaj obrabiamy pobrany item
Thread.Sleep(100);
}
}
public void ItemAdded()
{
//sprawdź, czy wątek już nie jest uruchomiony. Jeśli jest, to return
th.Start();
}
}
Mniej więcej tak to powinno wyglądać. No, zrobiłem to właściwie na klasach statycznych. Poprawniej będą to normalne klasy pewnie oparte na interfejsach. Ale tak to widzę.