Disons que j'ai cette classe Logger
qui enregistre des chaînes dans un thread de travail de priorité faible, qui n'est pas un thread d'arrière-plan. Les chaînes sont placées dans la file d'attente au Logger.WriteLine
et grignotées au Logger.Worker
. Aucune chaîne en file d'attente ne peut être perdue. À peu près comme celui-ci (mise en œuvre, le verrouillage, la synchronisation, etc. omis pour la clarté):Une classe avec un membre Thread doit-elle implémenter IDisposable?
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();
}
Depuis le thread de travail est un fil de premier plan, je dois être en mesure d'arrêter de manière déterministe si le processus devrait être en mesure de terminer .
Question: Est-ce la recommandation générale dans ce scénario pour laisser Logger
mettre en œuvre IDisposable
et arrêter le thread de travail dans Dispose()
? Quelque chose comme ceci:
public class Logger : IDisposable
{
...
public void Dispose()
{
AsyncStop();
this.workerThread.Join();
}
}
Ou y at-il de meilleures façons de le manipuler?