Verwenden Sie zunächst den Singleton-Modus im Entwurfsmodus, um die mehrfache Initialisierung von Objekten zu verhindern, was zu Inkonsistenzen im Zugriffsbereich führt.
Am Zählpunkt sollte eine Sperre hinzugefügt werden, um andere Thread-Zählungen vorübergehend zu blockieren und die Genauigkeit der Zählung sicherzustellen.
Wenn Sie in Echtzeit zählen und ausgeben möchten, können Sie die Zählung und Ausgabe zusammen sperren. Andernfalls werden die Zähl- und Ausgabeergebnisse verschiedener Threads möglicherweise nicht der Reihe nach verarbeitet.
Durch diese Sperrung kann eine sequentielle Verarbeitung und sequentielle Ausgabe gewährleistet werden, allerdings geht dadurch etwas an Leistung verloren.
Die Position des Schlosses im Code ist sehr wichtig
Der Grund dafür ist, dass dieser Thread noch nicht 200 Mal hinzugefügt wurde. Es muss jedoch zum ersten Mal ein Thread hinzugefügt werden. Treffen Sie daher eine Beurteilung beim Hinzufügen.
Kopieren Sie den Codecode wie folgt:
CommonSigleton MyCounter =CommonSigleton.Instance;
/// <Zusammenfassung>
/// Thread-Arbeit
/// </summary>
public void DoSomeWork()
{
///Anzeigezeichenfolge erstellen
string results = "";
///Eine Sigleton-Instanz erstellen
System.Threading.Thread.Sleep(100);
int i = 0;
while (MyCounter.GetCounter() < 200)
{
// Stellen Sie sicher, dass die Anzahl mit der Ausgabe übereinstimmt. Auch wenn zwischen der Anzahl und der Ausgabe ein Zeitintervall hinzugefügt wird, wird dieser Bereich gesperrt, um zu verhindern, dass andere Threads ausgeführt werden.
sperren(dies)
{
///Beginnen Sie mit dem Zählen
MyCounter.Add();
System.Threading.Thread.Sleep(100);
Thread thread = Thread.CurrentThread;
Ergebnisse += "Thread";
Ergebnisse += i++.ToString() + "――〉" + thread.Name + " ";
results += "Aktuelle Zählung:";
Ergebnisse += MyCounter.GetCounter().ToString();
Ergebnisse += "/n";
Console.WriteLine(results);
// Anzeigezeichenfolge löschen
Ergebnisse = "";
}
}
}
public void StartMain()
{
Thread thread0 = Thread.CurrentThread;
thread0.Name = "Thread 0";
Thread thread1 =new Thread(new ThreadStart(DoSomeWork));
thread1.Name = "Thread 1";
Thread thread2 =new Thread(new ThreadStart(DoSomeWork));
thread2.Name = "Thread 2";
Thread thread3 =new Thread(new ThreadStart(DoSomeWork));
thread3.Name = "Thread 3";
thread1.Start();
thread2.Start();
thread3.Start();
///Thread 0 führt nur die gleiche Arbeit aus wie andere Threads
DoSomeWork();
}
}