J'ai fait des recherches et regardé autour de moi et il me semble que la façon de procéder est d'utiliser un AutoResetEvent. J'ai rapidement mis cela ensemble et cela semble fonctionner et semble être sans danger pour les threads. Puis-je avoir des commentaires?.Net Thread.Suspend est obsolète. Je cherchais une alternative
class Program
{
private Thread workerThread;
private AutoResetEvent aResetEvent;
private bool _continueProcessing;
private bool active;
private Object locker = new Object();
public Program()
{
workerThread = new Thread(DoSomeProcessing);
workerThread.IsBackground = true;
aResetEvent = new AutoResetEvent(false);
}
public bool ContinueProcessing
{
get
{
lock (locker)
{
return _continueProcessing;
}
}
set
{
if (value)
{
aResetEvent.Set();
}
else
{
aResetEvent.Reset();
}
lock (locker)
{
_continueProcessing = value;
}
}
}
public void DoSomeProcessing()
{
int i = 0;
try
{
while (active)
{
aResetEvent.WaitOne();
// do some work and sleep
lock (locker)
{
if (ContinueProcessing)
{
aResetEvent.Set();
}
}
}
}
catch(ThreadInterruptedException tie)
{
Console.WriteLine("Shutting down.");
}
// any shutdown processing
}
public void StopProcessing()
{
workerThread.Interrupt();
workerThread.Join();
}
public void PauseProcessing()
{
ContinueProcessing = false;
}
public void Continue()
{
ContinueProcessing = true;
}
public void StartProcessing()
{
ContinueProcessing = true;
active = true;
}
}
EDIT: Salut à nouveau. J'ai utilisé les commentaires et je suis beaucoup plus satisfait de ma mise en œuvre. Juste une petite chose que j'aimerais ajouter, quand je fais une pause je voudrais attendre pour m'assurer que le fil a fait une pause et qu'il ne travaille plus. Est-ce possible? Peut-être que je devrais juste remplacer la pause et reprendre avec seulement le début et l'arrêt, puis sur l'arrêt faire un thred.join(). Commentaires?
Je me demande si vous auriez des problèmes de commande dans votre setter ContinuezProcessing? – ziya
vous définissez _continueProcessing deux fois - verrouillé et déverrouillé – tanascius
Peut-être que vous devriez mettre le verrou autour de tous (dans ContinuousProcessing setter) ou envisager un moyen de ne pas utiliser le drapeau? http://dotnet.org.za/markn/archive/2008/10/21/net-memory-model-bytecode-reordering.aspx – ziya