UPDATE
Wenn Sie C# 5 und .NET 4.5 oder höher Sie in erster Linie auf einem anderen Thread bekommen können vermieden werden, indem unter Verwendung von async
und await
, zB:
private async Task<string> SimLongRunningProcessAsync()
{
await Task.Delay(2000);
return "Success";
}
private void Button_Click(object sender, RoutedEventArgs e)
{
button.Content = "Running...";
var result = await SimLongRunningProcessAsync();
button.Content = result;
}
Einfach:
Dispatcher.BeginInvoke(new Action(delegate()
{
myListBox.Items.Add("new item"));
}));
Wenn Sie in Code-Behind sind. Andernfalls können Sie den Dispatcher zugreifen (die auf jeder UIElement
ist) mit:
Application.Current.MainWindow.Dispatcher.BeginInvoke(...
Ok das ist eine Menge in einer Zeile lassen Sie mich über sie gehen:
Wenn Sie Sie ein UI-Steuerelement aktualisieren möchten, wie Die Nachricht sagt, muss es aus dem UI-Thread tun. Es gibt eine eingebaute Methode, um einen Delegaten (eine Methode) an den UI-Thread zu übergeben: . Sobald Sie die Dispatcher
haben, können Sie entweder Invoke()
von BeginInvoke()
übergeben einen Delegaten auf dem UI-Thread ausgeführt werden. Der einzige Unterschied ist Invoke()
wird nur zurückgegeben, sobald der Delegat ausgeführt wurde (d. H.in Ihrem Fall wurde der neue Eintrag der ListBox hinzugefügt), während BeginInvoke()
sofort zurückkehrt, so dass Ihr anderer Thread, von dem Sie anrufen, fortfahren kann (der Dispatcher wird Ihren Delegierten bald ausführen, wie es kann, was wahrscheinlich sowieso sofort sein wird).
I bestanden einen anonymen Delegierten oben:
delegate() {myListBox.Items.Add("new item");}
Das Bit zwischen den {} die Verfahrensblock. Dies wird anonym genannt, da nur einer erstellt wird und keinen Namen hat (normalerweise können Sie dies mit einem Lambda-Ausdruck tun, aber in diesem Fall kann C# die aufzurufende BeginInvoke() -Methode nicht auflösen). Oder ich könnte einen Delegaten instanziiert haben:
Action myDelegate = new Action(UpdateListMethod);
void UpdateListMethod()
{
myListBox.Items.Add("new item");
}
Dann ging das:
Dispatcher.Invoke(myDelegate);
ich auch die Action-Klasse verwendet, die ein in Delegat gebaut, aber Sie könnte Ihre eigene erstellt - Sie können lesen, mehr über Delegaten auf MSDN, da dies ein wenig off topic geht.
Ich bin zu müde, um eine vollständige Antwort zu schreiben, aber hier ist ein Hinweis: sehen Sie sich um (Google, SO oder MSDN) für Dispatcher. Jetzt gehe ich ins Bett. –