WARNUNG Ich bin ein kompletter Neuling mit async/erwarten, und so missverstehen Sie wahrscheinlich dies vollständig!Warum läuft mein Async-Code nicht asynchron?
Ich versuche herauszufinden, wie das Zeug funktioniert, und versuchte ein einfaches bisschen Code in der Ansicht eines WPF-Fensters. Ich fügte hinzu, Event-Handler auf eine Schaltfläche klicken, und fügte einige sync und async Methoden wie folgt ...
public partial class MainWindow {
private Random _r = new Random(DateTime.Now.Millisecond);
public MainWindow() {
InitializeComponent();
}
private async void Bleah_Click(object sender, RoutedEventArgs e) {
LstMessages.Items.Clear();
AddToMsg("Starting...");
DoSyncStuff();
await DoStuffAsync();
DoMoreStuffSync();
AddToMsg("Done");
}
private void DoSyncStuff() {
int delay = _r.Next(500, 1500);
AddToMsg("DoSyncStuff - waiting for " + delay + "ms");
Thread.Sleep(delay);
AddToMsg("DoSyncStuff - finished");
}
private void DoMoreStuffSync() {
int delay = _r.Next(500, 1500);
AddToMsg("DoMoreStuffSync - waiting for " + delay + "ms");
Thread.Sleep(delay);
AddToMsg("DoMoreStuffSync - finished");
}
private async Task DoStuffAsync() {
await Task.Run(() => {
int delay = _r.Next(500, 1500);
AddToMsg("DoStuffAsync - waiting for " + delay + "ms");
Thread.Sleep(delay);
AddToMsg("DoStuffAsync - finished");
});
}
private void AddToMsg(string msg) {
Dispatcher.BeginInvoke(
new Action(() => { LstMessages.Items.Add(DateTime.Now.ToString("HH:mm:ss.fff") + " - " + msg); }));
}
LstMessages
ein ListBox auf dem Fenster ist.
Wenn ich auf die Schaltfläche klicke, sehe ich, dass die drei Methoden immer in der Reihenfolge ausgeführt werden, in der ich sie anrufe, unabhängig von der Länge jeder Verzögerung.
Ich verstehe offensichtlich nicht, wie das Zeug funktioniert, aber nachdem ich einige Stunden lang herumgelesen bin und viele Variationen des Codes ausprobiert habe, kann ich nicht so funktionieren, wie ich es erwarte.
Bitte kann jemand klären, was ich hier falsch gemacht habe?
Async nicht parallelisieren nicht Ihr Code es einfach nicht den aufrufenden Thread blockieren. – juharr
Eine gute Ressource ist https://msdn.microsoft.com/en-us/magazine/jj991977.aspx - einige der Beispiele sollten zu Ihrem Fall sprechen – Brian
Verwenden Sie 'Thread.Sleep' nicht in Ihrer asynchronen Methode. Verwenden Sie 'Task.Delay', damit Sie den Thread nicht blockieren. – mason