Je voudrais exécuter du code alternativement, afin que je puisse arrêter l'exécution à tout moment. Ce code est-il sûr?Est-ce un moyen sûr d'exécuter des threads en alternance?
static class Program
{
static void Main()
{
var foo = new Foo();
//wait for interaction (this will be GUI app, so eg. btnNext_click)
foo.Continue();
//wait again etc.
foo.Continue();
foo.Continue();
foo.Continue();
foo.Continue();
foo.Continue();
}
}
class Foo
{
public Foo()
{
new Thread(Run).Start();
}
private void Run()
{
Break();
OnRun();
}
protected virtual void OnRun()
{
for (var i = 0; i < 5; i++)
{
Console.WriteLine(i);
Break();
}
//do something else and break;
}
private void Break()
{
lock (this)
{
Monitor.Pulse(this);
Monitor.Wait(this);
}
}
public void Continue()
{
lock (this)
{
Monitor.Pulse(this);
Monitor.Wait(this);
}
}
}
Bien sûr, je sais, que maintenant l'application ne finira jamais, mais ce n'est pas le point. J'ai besoin de cela, car je voudrais présenter les étapes d'une sorte d'algorithme et décrire ce qui se passe à un moment particulier, et faire tout dans un thread conduirait à de nombreuses complications, même en utilisant une petite quantité de boucles dans le code. Par exemple ces lignes:
for (var i = 0; i < 5; i++)
{
Console.WriteLine(i);
Break();
}
devrait être ensuite remplacé par:
if (this.i < 5)
{
Console.WriteLine(i++);
}
Et c'est juste un petit exemple de ce que je veux présenter. Le code sera plus compliqué qu'une boucle for
factice.
C'est bizarre. N'utilisez pas de thread. –
@Hans Passant: Comment feriez-vous ce genre de ... self explaining (?) Code? A l'intérieur de 'OnRun' je voudrais exécuter des algorithmes liés aux graphiques et montrer l'explication de l'utilisateur de ce qui se passe dans ce moment, par exemple.avec des messages et des vertices/bords de coloration. Diviser une telle chose en petits morceaux serait pénible à coder. – prostynick
La manière dont vous avez formulé la question semble indiquer que vous n'êtes pas familier avec le modèle de threads d'interface utilisateur pour Windows Forms. Vous devriez expliquer ce qui ne peut pas être fait avec un événement qui doit "alterner" avec un thread d'arrière-plan séparé. – David