Zitat von
OregonGhost:
Ach ja: Du kannst natürlich auch, anstatt umständlich zu prüfen etc., von vornherein vom Thread aus ein Invoke oder BeginInvoke ausführen. Das kommt dann am ehesten der Synchronize-Geschichte nahe.
Das würde ich auch empfehlen, dadurch habe ich InvokeRequired noch nie benötigt.
In diesem Fall bieten sich entweder der Thread-Pool oder Asynchronous Delegates an:
Code:
// ThreadPool
// Der Name sagt alles: anstatt jedes Mal einen neuen Thread zu
// erstellen, wird wenn möglich ein alter aus dem Pool benutzt.
// Kein Rückgabewert
// => Nach Ende noch einmal Invoke oder andersweitige Übergabe
ThreadPool.QueueUserWorkItem((state) => {
int sum = 0;
for (int i = 1; i <= 10005; i++) {
sum += i;
if (i % 1000 == 0)
// Achtung: Invoke ist synchron
// asynchron: BeginInvoke
Invoke(new Action<int>(AddItem), sum);
// oder inline:
// Invoke(new Action(() => listBox.Items.Add(i)));
}
Invoke(new Action(() => listBox.Items.Add(sum)));
}, null);
//3. Asynchronous Delegates
//Benutzen intern ThreadPool
//Rückgabewert möglich
Func<int> func =
() => {
int sum = 0;
for (int i = 1; i <= 10005; i++) {
sum += i;
if (i % 1000 == 0)
Invoke(new Action(() => listBox.Items.Add(sum)));
}
return sum;
};
func.BeginInvoke(
(IAsyncResult result) =>
Invoke(new Action(() => AddItem(func.EndInvoke(result)))),
null);
[...]
void AddItem(int i)
{
listBox.Items.Add(i);
}
Wenn ich's recht bedenke, gibt es aber keinen wirklichen Vorteil der Delegates im Vergleich zum Thread-Pool, weshalb ich mich mit ihnen gar nicht erst auseinandersetzen würde.