Задачка:
есть синглтон объект:
public class MySingleton
{
// === static members ===
private static MySingleton _inst = null;
static MySingleton()
{
if(_inst==null)
_inst = new MySingleton();
}
public static AddMsg(object msg) // помещает месидж в очередь для обработки
{
Queue.Synchronized(_inst.msgQueue).Enqueue( msg );
_inst.workEvent.Set();
}
public static Stop() // необходимо вызвать перед закрытием приложения
{
_inst.workActive = false;
_inst.workEvent.Set();
_inst.workThread.Join();
}
// === instance members ===
private Queue msgQueue = new Queue();
private Thread workThread;
private bool workActive = false;
private AutoResetEvent workEvent = new AutoResetEvent(false);
private MySingleton()
{
workThread = new Thread(new ThreadStart(workProc));
workActive = true;
workThread.Start();
}
private void workProc() // поток обработки очереди
{
Queue Q = Queue.Synchronized(msgQueue);
bool exit = false;
while(true)
{
workEvent.WaitOne();
if(!workActive)
exit = true;
while(Q.Count>0)
processMsg(Q.Dequeue());
if(exit)
break;
}
}
private void processMsg(object msg) // обработка месиджа
{
//...
}
}
объкет получает месиджи через вызов AddMsg и асинхронно обрабатывает их в своем потоке.
Проблема возникает при закрытии приложения — в очереди msgQueue еще остаются необработанные месиджи, а объект уничтожается.
Можно конечно из приложения вызывать метод Stop который подождет пока накопившаяся очередь будет обработана, однако хотелось бы чтобы объект сам контролировал этот момент.
Если же вызывать метод Stop из деструктора, то он не успевает обработать все месиджи — объект преждевременно уничтожается.
как это можно решить чтобы приложению не нужно было вызывать метод Stop перед закрытием?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>