Ich denke, ich verstehe in etwa worum es geht.
Für ein sauberes Threading muss man festlegen, wie der Thread laufen soll und wie er gestoppt werden darf.
Es ist nicht ohne Weiteres möglich (es gibt schon Methoden, aber die würde ich nicht empfehlen) einen Thread zu stoppen, wenn die Methode, die ausgeführt wird selbst nicht überprüft, ob sie ihre Arbeit abbrechen muss oder weitermachen kann.
Grundsätzlich kann der Thread in deinem Fall in der Klasse myProcessor erstellt werden und über Abort beendet werden.
Denn Abbruch über Abort zu machen, wäre jedoch nicht sehr klug, da dies ungeahnte Folgen haben kann.
Zum einen wird eine ThreadAbortException im laufenden Thread ausgelöst und zum anderen kann man nicht bestimmen wo genau der Abbruch stattfinden soll.
Dann würde das wie folgt aussehen:
Class myProcessor
{
private BlackBoxWorker bbWork;
private bool running;
private Thread myThread;
public myProcessor() {
bbWork = new BlackBoxWorker();
}
public void Starting() {
myThread = new Thread(bbWork.Work);
myThread.Start();
running = true;
}
public void Stopping() {
if (running) {
myThread.Abort();
}
running = false;
}
}
Um aber eine geeignete Methode zu finden, muss natürlich klar sein wie in diesem Beispiel der BlackBoxWorker seine Arbeit im Hintergrund ausführen soll.
Die Verwendung einer while-Schleife und das Prüfen des Parameters
running deutet für mich darauf hin, dass die Arbeit in der Work-Methode immer vollständig abgeschlossen werden muss und dann wiederholt werden soll.
Sehe ich das richtig?
Solche grundsätzlichen Formulierungen sind wichtig, damit auch hilfreiche Antworten gegeben werden können ;-)
Ich gehe daher einmal von folgender Sachlage aus:
Es gibt die Klasse BlackBoxWorker.
Diese Klasse besitzt die Methode Work.
Die Methode Work erledigt bestimmte Aufgaben, die vollständig ausgeführt werden müssen.
Wenn die Arbeit abgeschlossen wurde, soll dieser Schritt wiederholt werden, sofern kein "Stop" (Abbruch) signalisiert wurde.
Wenn dies das Ziel ist, dann könnte die Lösung auch wie folgt aussehen:
class myProcessor
{
private BlackBoxWorker bbWork;
private bool running; // Wird vom Thread festgelegt; zur Prüfung ob der Thread beendet wurde
private bool doAgain; // Wird vom Thread beim Start festgelegt; zur Angabe, ob die Arbeit wiederholt werden soll
private Thread myThread;
public myProcessor() {
bbWork = new BlackBoxWorker();
}
public void Starting() {
if(running) return;
myThread = new Thread(this.Worker);
myThread.Start();
}
private void Worker() {
running = true;
doAgain = true;
while(doAgain) {
bbWork.Work(); // This is blocking the whole Thread for some time
Thread.Sleep(5000);
}
running = false;
}
public void Stopping() {
if(!running) return;
doAgain = false;
myThread.Join(); // (optional) wartet auf den Abschluss des Threads
}
}
class Application
{
static void main (args)
{
myProcessor mP = new myProcessor();
// doing work here ....
// myProcessor im background starten ....
// aber wie ?
mP.Starting();
// doing work here
// myProcessor im background stopen ....
// aber wie ?
mP.Stopping();
}
}
Vielleicht konnte ich ja doch helfen :-)