Ich versuche, eine Parallel.ForEach-Schleife zu implementieren, um eine alte foreach
-Schleife zu ersetzen, aber ich habe Schwierigkeiten, meine UI zu aktualisieren (ich habe einen Zähler, der etwas wie 'x/y Dateien verarbeitet' anzeigt). Ich habe ein Beispiel für eine Parallel Forloop
erstellt, um mein Problem zu veranschaulichen (das Label wird nicht aktualisiert).
Verwenden von System;
Verwenden von System.Windows.Forms;
Verwenden von System.Threading.Tasks;
Verwenden von System.Threading;
Namespace FormThreadTest
{
Öffentliche teilklasse Form1 : Form
{
Private Synchronisierungskontext m_sync;
Privater System.Timers.Timer m_timer;
Privates int m_count;
Öffentliche Form1()
{
InitializeComponent();
m_sync = Synchronisierungskontext.Current;
m_count = 0;
m_timer = Neuer System.Timers.Timer();
m_timer.Interval = 1000;
m_timer.AutoReset = true;
m_timer.Elapsed += new System.Timers.ElapsedEventHandler(m_timer_Elapsed);
m_timer.Start();
}
Private void m_timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Task.Factory.StartNew(() =>
{
m_sync.Post((o) =>
{
label1.Text = m_count.ToString();
Application.DoEvents();
}, null);
});
}
Private void button1_Click(object sender, EventArgs e)
{
Task.Factory.StartNew(() =>
{
Parallel.For(0, 25000000, delegate(int i)
{
m_count = i;
});
});
}
}
}
Wenn ich die Methode für das Klicken auf den Schaltflächen-Event ändere und ein Thread.Sleep() hinzufüge, scheint dies dem UI-Aktualisierungsthread Zeit zu geben, um seine Arbeit zu erledigen:
private void button1_Click(object sender, EventArgs e)
{
Task.Factory.StartNew(() =>
{
Parallel.For(0, 25000000, delegate(int i)
{
m_count = i;
Thread.Sleep(10);
});
});
}
Gibt es keine Möglichkeit, das Sleep zu vermeiden, oder muss ich es dort haben? Es scheint, dass meine UI das Label nicht aktualisieren wird, es sei denn, ich tue es? was ich seltsam finde, da ich das Anwendungsfenster verschieben kann (es blockiert sich nicht) - warum aktualisiert sich das Label also nicht, und wie kann ich meinen Code ändern, um Parallel.For(Each) und UI-Updates besser zu unterstützen?
I've been searching for a solution, but I can't seem to find anything (or I maybe searching for the wrong thing?).
Mit freundlichen Grüßen Simon