Dies ist das erste Mal, dass ich versucht habe, Threads in einer Anwendung zu verwenden. Ich weiß, dass diese Frage schon einmal gestellt wurde, aber von den Lösungen, die ich mir angeschaut habe, kann ich nicht sehen, wie ich sie in meiner Situation anwenden kann.C# Wie man überprüft, ob ein Thread fertig ist, bevor man einen anderen startet
Ich habe ein Programm, in dem eine Datagridview alle 60 Sekunden mit einem Timer aktualisiert wird. Die Daten stammen aus einer SQL-Datenbank. Dieser Timer startet auch einen Worker-Thread, um nach einem bestimmten Bluetooth-Gerät zu suchen und die Datenbank basierend auf den Ergebnissen im Hintergrund zu aktualisieren. Die Bluetooth-Suche ist besonders langsam, weshalb ich sie in einen Worker-Thread lege.
Mein Problem ist, manchmal ein neuer Arbeitsthread startet, bevor der vorherige fertig ist. Zumindest ist das die einzige logische Erklärung für die Fehler, die ich bekomme. Das große Give Away ist ein Datei-Locked-Fehler, wenn das einzige, was die Datei sperren kann, ein anderer Worker-Thread aus derselben Anwendung ist.
Hier ist der Code, den ich verwende, um den Hintergrund Thread zu starten.
private void timerScreenRefresh_Tick(object sender, EventArgs e)
{
if (LocalUtilities.Debug > 3) LocalUtilities.writeLogFile(4, "Primary", LocalUtilities.getCurrentMethod() + "()", "");
// If the user is not on a Remote desktop connection
if (!remoteDesktopUser)
{
// Run the Bluetooth Search in a worker thread
Thread thread = new Thread(new ThreadStart(this.checkProximity));
thread.IsBackground = true;
thread.Start();
}
// Load User Data from the DB and display on the screen
loadUserData();
}
Es scheint, dass die Lösung verwenden thread.IsAlive ist(), aber ich habe nicht in der Lage gewesen, ein gutes Beispiel zu finden. Es scheint komisch zu versuchen, nach der Existenz eines Threads zu suchen, wenn ich gerade einen neuen erstellt habe mit "Thread thread = new Thread()"
Offensichtlich vermisse ich etwas. Ich bin mit Visual Studio 2008. Vielen Dank für alle Ideen David
UPDATE
Auf der Grundlage der vorgeschlagenen Lösung von krw12572 unter ich schon versucht, diese ...
Ich änderte das! = Zu == weil ich immer noch die loadUserData() Methode im primären Thread ausführen möchte.
Im Editor bekomme ich eine grüne Unterstreichung auf "_bluetoothSearchThread" und sagt mir, dass das Feld nie zugewiesen wird und immer den Wert NULL haben wird.
Zur Laufzeit bekomme ich einen Fehler "Objektreferenz nicht auf eine Instanz eines Objekts gesetzt" in dieser Zeile.
if (_bluetoothSearchThread == null && _bluetoothSearchThread.IsAlive)
Wie wird dieser Wert zugewiesen?
private Thread _bluetoothSearchThread;
private void timerScreenRefresh_Tick(object sender, EventArgs e)
{
if (LocalUtilities.Debug > 3) LocalUtilities.writeLogFile(4, "Primary", LocalUtilities.getCurrentMethod() + "()", "");
// Check if Worker Thread is already running.
if (_bluetoothSearchThread == null && _bluetoothSearchThread.IsAlive)
{
if (LocalUtilities.Debug > 3) LocalUtilities.writeLogFile(4, "Primary", LocalUtilities.getCurrentMethod() + "()", "Previous Worker Thread not running");
// If the user is not on a Remote desktop connection
if (!remoteDesktopUser)
{
// Check if the users mobile phone is within range
// Run the Bluetooth Search in a worker thread
Thread thread = new Thread(new ThreadStart(this.checkProximity));
thread.IsBackground = true;
thread.Start();
}
}
else
{
if (LocalUtilities.Debug > 3) LocalUtilities.writeLogFile(4, "Primary", LocalUtilities.getCurrentMethod() + "()", "Worker Thread still running don't start another one");
}
// Load User Data from the DB and display on the screen
loadUserData();
}
aktualisieren 2
OK Ich glaube, ich es herausgefunden haben. Ich habe die! = Null wieder auf die Art und Weise geändert und den IF und Else auf die andere Seite gedreht.
Dann hatte ich mein Gehirn ein wenig zu verwenden und geändert „Gewinde“ auf „_bluetoothSearchThread“
nun der Code kompiliert und ausgeführt. Jetzt muss ich es nur testen, indem ich die Bedingungen auslöst, die den Dateisperrfehler verursachen, um zu sehen, ob ich das ursprüngliche Problem tatsächlich behoben habe. Wenn es funktioniert, markiere ich krw12572 als richtig.
Aktualisierung 2.5 Ich musste auch diese Linie bewegen, damit es nicht eine neue Instanz zu früh schafft
_bluetoothSearchThread = new Thread(new ThreadStart(this.checkProximity));
Das ist also die Arbeitslösung.
private Thread _bluetoothSearchThread;
private void timerScreenRefresh_Tick(object sender, EventArgs e)
{
if (LocalUtilities.Debug > 3) LocalUtilities.writeLogFile(4, "Primary", LocalUtilities.getCurrentMethod() + "()", "");
// Check if Worker Thread is already running.
if (_bluetoothSearchThread != null && _bluetoothSearchThread.IsAlive)
{
// Thread is still running. Just log it and move on.
if (LocalUtilities.Debug > 3) LocalUtilities.writeLogFile(4, "Primary", LocalUtilities.getCurrentMethod() + "()", "******** Worker Thread still running don't start another one *********");
}
else
{
if (LocalUtilities.Debug > 3) LocalUtilities.writeLogFile(4, "Primary", LocalUtilities.getCurrentMethod() + "()", "Previous Worker Thread not running");
// If the user is not on a Remote desktop connection
if (!remoteDesktopUser)
{
// Check if the users mobile phone is within range
// Run the Bluetooth Search in a worker thread
_bluetoothSearchThread = new Thread(new ThreadStart(this.checkProximity));
_bluetoothSearchThread.IsBackground = true;
_bluetoothSearchThread.Start();
}
}
// Load User Data from the DB and display on the screen
loadUserData();
}
Hier Ihr Ergebnis: http://stackoverflow.com/questions/12949024/detecting-a-thread-is-already-running-in-c-sharp-net –
@BALA Ich habe vor, dass die Lösung sehen. Es schien übermäßig komplex und ich verstand es nicht wirklich. Ich werde versuchen, es morgen blind zu verfolgen und zu sehen, ob etwas Machbares herauskommt. –
Mögliches Duplikat von [Wie überprüft man, ob Thread die Ausführung beendet hat] (http://stackoverflow.com/questions/2773479/how-to-check-if-thread-finished-execution) –