C# Threading.Aussetzen Veraltet, thread ist veraltet?
In meiner Anwendung, ich trete meine Datei Lesen von einem anderen thread(andere, dass der GUI-thread). Es gibt zwei Schaltflächen, die suspend-und resume-Thread bzw.
private void BtnStopAutoUpd_Click(object sender, EventArgs e)
{
autoReadThread.Suspend();
}
private void BtnStartAutoUpd_Click(object sender, EventArgs e)
{
autoReadThread.Resume();
}
aber ich bin mit dieser Warnung,
Thread.Auszusetzen, wurde abgelehnt. Verwenden Sie bitte einen anderen Klassen im System.Threading, wie Monitor, Mutex, Event und Semaphore zur Synchronisierung von Threads oder Ressourcen schützen. http://go.microsoft.com/fwlink/?linkid=14202
Alle, wie ich nur single-thread (und nicht als GUI-thread), also Wie kann ich die Synchronisierung hier, oder monitor.
Update-Code:
class ThreadClass
{
//This delegate enables asynchronous calls for setting the text property on a richTextBox control.
delegate void UpdateTextCallback(object text);
//create thread that perform actual task
public Thread autoReadThread = null;
public ManualResetEvent _event = new ManualResetEvent(true);
//a new reference to rich text box
System.Windows.Forms.RichTextBox Textbox = null;
private volatile bool _run;
public bool Run
{
get { return _run; }
set { _run = value; }
}
public ThreadClass(string name, System.Windows.Forms.RichTextBox r1)
{
Textbox = r1;
Run = true;
this.autoReadThread = new Thread(new ParameterizedThreadStart(UpdateText));
this.autoReadThread.Start(name);
}
private void UpdateText(object fileName)
{
//while (true)
//{
// _event.WaitOne();
while (Run)
{
if (Textbox.InvokeRequired)
{
UpdateTextCallback back = new UpdateTextCallback(UpdateText);
Textbox.BeginInvoke(back, new object[] { fileName });
Thread.Sleep(1000);
}
else
{
string fileToUpdate = (string)fileName;
using (StreamReader readerStream = new StreamReader(fileToUpdate))
{
Textbox.Text = readerStream.ReadToEnd();
}
break;
//}
}
}
}
}
}
laufen bool-Wert, einen thread steuert es(Zunächst seine wahre)
und starten thread erstelle ich diese Klasse-Instanz(diese start-thread auch) in einer anderen Klasse
- Aktualisieren Sie nicht zeigen: a) Wie der thread gestartet wird, b) die vollständige thread-Methode.
- InvokeRequired ist immer wahr. Dein thread nichts nützliches, alles läuft auf dem UI-thread.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beachten Sie, dass alle Vorgänge abgeschlossen sind, bevor der thread ist "suspendiert"
, Was Sie wollen
_event.Set()
? Ich setze den ersten Zustand zufalse
auf dieManualResetEvent
wodurch es warten am set, bevor Sie fortfahrenManualResetEvent _event = new ManualResetEvent(true);
, da das Standardverhalten sollte für die thread ausgeführt werden.ManualResetEvent
Konstruktor. Überprüfen Sie den aktualisierten code.Den Grund Suspend-und Resume veraltet ist, weil es keine Garantien gibt, an welcher Stelle in der Ausführung der thread wird angehalten, auf. Das ist eine schlechte Sache. Das Problem ist beschrieben hier sowie eine Lösung.
Sollte die Lösung beteiligten ein WaitHandle (vielleicht AutoResetEvent oder ManualResetEvent), die Sie verwenden können, um das signal zu Ihrem autoReadThread zu stoppen/starten.
Ich würde den Monitor-Mechanismus für die Erreichung anhalten und fortsetzen von threads. Die Monitor.Warten, die Sache dem thread warten, bis der Monitor.Puls.