Ich versuche jetzt, die Leistung einer Winform-Anwendung zu verbessern, indem Sie es multi-threaded machen. Derzeit sieht die Klasse wie:Verbessern Sie die Leistung durch Multithreading
public class MainClass
{
List<DataItem> data; //thousands of DataItem, but each is independent
//and a lot of non-thread-safe variables here,variable1 variable2 ...
public void Go()
{
data.ForEach(item => DealWithDataItem(item));
}
public void DealWithDataItem(DataItem item)
{
//costs really long time here
Step1(item);
Step2(item); //and a lot of StepN(item)
}
public void StepN(DataItem item)
{
//variable1 = blabla
//variable2 = blabla ..etc
}
}
I ThreadPool
für jede DataItem verwenden möchten.
data.ForEach(item => ThreadPool.QueueUserWorkItem(s => DealWithDataItem(item)));
Aber so viele nicht Thread-sichere Variablen! Ich kann sie nicht in einer Methode deklarieren, weil sie zwischen den Methoden StepN
geteilt wird. Und es ist ziemlich schwer, sie alle threadsicher zu machen! Mache ich etwas falsch? Irgendwelche guten Lösungen? Vielen Dank!
ist kein Hintergrundarbeiter ausreichend? –
Es hängt wirklich davon ab, was Sie mit Ihren Variablen tun1..n summieren sie Werte? Liest du? Schreiben? Sie müssen viel genauer über die Verwendung dieser Variablen sein. Für unterschiedliche Nutzungsmuster gibt es unterschiedliche Lösungen. –
Verstehe nicht ganz.Ist 'MainClass' eine Art Monitor für den Gesamtfortschritt beim Umgang mit' DataItem'-Fortschritt (also benötigt man sie als Status für 'MainClass'). Wenn nicht, sollten Sie separate Objekte für jede Ihrer Arbeiten erstellen. –