c# wie Sie richtig halt einen thread und starten Sie es zurück?
Habe ich eine Methode hat einige Arbeit und ruft eine Methode auf, nachdem es fertig ist. In dieser neu aufgerufenen Methode, hörte ich den thread.
aber wenn ich halt den thread, alle die folgende Zeile wird nicht ausgelesen werden. Gibt es eine richtige Art und Weise zu beenden den thread und starten Sie es zurück?
Hier ist mein code-snippet:
public partial class Form1 : Form
{
string strProvider;
MySqlConnection sqlConn;
MySqlCommand command;
MySqlDataReader Reader;
Thread workerThread;
public Form1()
{
InitializeComponent();
initializedb();
workerThread = new Thread(shows);
workerThread.Start();
workerThread.IsBackground = true;
public void shows()
{
string k;
command.CommandText = "SELECT * FROM imageframe1";
sqlConn.Open();
Reader = command.ExecuteReader();
while (Reader.Read())
{
k = (string)(Reader.GetValue(1));
pictureBox1.Image = Image.FromFile(k);
Thread.Sleep(3000);
}
sqlConn.Close();
stopthread();
}
public void stopthread()
{
workerThread.Abort();
//*************everything after this line wont run********
MessageBox.Show("end");
//Thread.Sleep(3000);
//workerThread.Start();
}
was ich hier mache ist, dass ich bin dabei eine Diashow der Bilder.also ich möchte halt den thread und starte ihn wieder,überprüfen Sie die db für neue Bilder und wieder laufen die ganze Sache statt der Schleife drinnen, es wird eine Menge von Speicher-Ressourcen.aber problem ist, wenn ich es stoppen, ich kann nicht laufen nichts nach.
könnte jemand bitte etwas Licht für einen Anfänger hier??mit Beispielen wäre wirklich gut für mich zu verstehen.
- Der thread, der Selbstmord begeht, durch den Aufruf stopthread() selbst. Entfernen Sie diese harikiri-code.
- Warum nicht Sie führen Sie es einfach in einen neuen thread everytime?
- wie soll ich das machen?kann u geben Sie mir ein Beispiel?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist nicht die Art und Weise zu unterbrechen Programm. Wenn Sie möchten, dass der Benutzer in der Lage sein, um vorübergehend anzuhalten Lesung aus Ihrem reader eine besser Weg ist das zu handhaben, ist durch setzen von Flagge an, dass die while-Schleife prüfen kann, auf jeder iteration. Threads sollten niemals direkt manipuliert werden, durch aufrufen
Thread.Abort
. So anstatt zu versuchen zu stoppen Sie den thread auf, Ihre "stopthread" - Methode sollte eigentlich mehr wie folgt Aussehen:Nun, um wirklich Respekt dieser Aktion anhalten, müssen Sie ändern die das Lesen zu überprüfen, diese Flagge. Ein Ansatz wäre zu prüfen, ob es angehalten, in jeder iteration des Lesens vom Leser und wenn ja, warten Sie, bis es wird unpaused:
Natürlich, Sie würden wollen auch einen "startThread" - Methode sowie:
Dieser Ansatz hat den Nachteil, dass es Blätter die SQL-Verbindung zu öffnen und bindet einen Faden, während die Pause. Ein anderer Ansatz wäre, sich zu erinnern, wie viele Zeilen Sie bearbeitet habe und einfach neu starten, den thread, wenn Sie Neustarten, ab, wo Sie aufgehört haben. Sie wollen aufhören, den thread in ähnlicher Weise -- Prüfung der Flagge, wenn es angehalten und schließen der Verbindung und die Reinigung beim anhalten. Dann, wenn unpausing Sie müssten, um den Prozess zu starten von Anfang an mit einem neuen thread, irgendwie verwalten zu überspringen diejenigen, die Sie bereits verarbeitet wird-möglicherweise mit einer Anpassung der SQL.
Eine Letzte Sache zu prüfen, ist die Verwendung thread-pools anstatt threads manuell, aber für ein WinForms-app, der Aufwand ist wohl belanglos.
ManualResetEvent
als ich dies schrieb, oder ich würde es benutzt haben. Ich werde versuchen, aktualisieren Sie diese Antwort, wenn ich eine chance bekomme.Hier ist eine tolle Serie über die C# threading. Wirklich, ich meine es. Möchten Sie vielleicht einen Blick ein es da die Suche nach Lösungen, beim Umgang mit dem thread nicht nur um eine Lösung zu finden, aber am wichtigsten ist, wirklich zu verstehen, was gerade passiert, neben 😉
http://www.albahari.com/threading/
Meine grand ' MA immer zu sagen pflegte: "Don' T mess with-Threads"... Und Sie hatte Recht...
Ich würde empfehlen, sich auf die ManualResetEvent-Klasse. Sie können Ihren thread warten, bis es signalisiert aus dem UI-thread und dann weiter. Die ManualResetEvent-Klasse kann sich in zwei Zuständen: signalisiert oder nicht signalisiert. Threads nennen kann WaitOne (), die nicht zurückkehren wird, bis der Zustand signalisiert wird (oder sofort zurückkehren, wenn der Staat bereits signalisiert). Sie signalisiert durch den Aufruf von Set() und setzen Sie es auf nonsignalled durch aufrufen von Reset():
Allerdings, warum nicht einfach einen timer auf dein Formular, und legen Sie das Intervall 3000 ms und laden Sie das Bild in der UI-thread? Wie es aussieht, bekommst du nur die Dateinamen aus der Datenbank. Wenn es nicht allzu viele sollten Sie im Voraus laden Sie Sie in einer Liste und behalten Sie Ihre position, anstatt pflegen eine offene Verbindung und Leser. Die 10.000 strings von 100 Zeichen jeder würde nur bis etwa 200k Speicher.