Допустим, у меня есть класс Logger
, который регистрирует строки в низкоприоритетном рабочем потоке, который не является фоновым потоком. Строки ставятся в очередь в Logger.WriteLine
и пережевываются в Logger.Worker
. Никакие строки в очереди не могут быть потеряны. Примерно так (реализация, блокировка, синхронизация и т. д. опущены для ясности):
public class Logger
{
private Thread workerThread;
private Queue<String> logTexts;
private AutoResetEvent logEvent;
private AutoResetEvent stopEvent;
// Locks the queue, adds the text to it and sets the log event.
public void WriteLine(String text);
// Sets the stop event without waiting for the thread to stop.
public void AsyncStop();
// Waits for any of the log event or stop event to be signalled.
// If log event is set, it locks the queue, grabs the texts and logs them.
// If stop event is set, it exits the function and the thread.
private void Worker();
}
Поскольку рабочий поток является потоком переднего плана, я должен иметь возможность детерминистически остановить его, если процесс должен завершиться.
Вопрос. Является ли общей рекомендацией в этом сценарии позволить Logger
реализовать IDisposable
и остановить рабочий поток в Dispose()
? Что-то вроде этого:
public class Logger : IDisposable
{
...
public void Dispose()
{
AsyncStop();
this.workerThread.Join();
}
}
Или есть лучшие способы справиться с этим?