Comment synchroniser correctement? Pour l'instant, il est possible que SetData
soit appelée après que e.WaitOne()
a été complétée, alors d
pourrait déjà être réglé sur une autre valeur. J'ai essayé d'insérer des verrous mais cela s'est soldé par un blocage.C# Problème de filetage avec AutoResetEvent
AutoResetEvent e = new AutoResetEvent(false);
public SetData(MyData d)
{
this.d=d;
e.Set(); // notify that new data is available
}
// This runs in separate thread and waits for d to be set to a new value
void Runner()
{
while (true)
{
e.WaitOne(); // waits for new data to process
DoLongOperationWith_d(d);
}
}
Est-ce que la meilleure solution est d'introduire une nouvelle dataAlreadyBeenSetAndWaitingToBeProcessed
booléenne variable définie dans SetData
true et à la fin de DoLongOperationWith_d
il pourrait être définie sur true, donc si SetData
est appelée avec cette variable à true ça pourrait juste revenir?
@ Spencer Ruport: Quoi? Si pending est défini sur true la première fois que SetData est appelée, il sera lancé une deuxième fois. Je suis sûr qu'il y a un moyen de le casser, mais je ne pense pas que ce soit avec la séquence que vous avez décrite. – Sean
mais this.d ne peut pas être défini sauf si pending est false. –
Mon mauvais. Je n'ai pas vu le 'if (pending)' là. –