ПРЕДУПРЕЖДЕНИЕ Я полный новичок с async/await, и поэтому, наверное, это неправильно понимаю!Почему мой асинхронный код не работает async?
Я пытаюсь понять, как работает этот материал, и попробовал простой бит кода в окне WPF. Я добавил обработчик события нажатия кнопки, и добавлены некоторые синхронизации и асинхронные методы следующим образом ...
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
является ListBox на окне.
Когда я нажимаю кнопку, я вижу, что три метода всегда выполняются в том порядке, который я им называю, независимо от длины каждой задержки.
Я, очевидно, не понимаю, как работает этот материал, но, прочевав несколько часов и пробовав множество вариантов кода, я не могу заставить его работать, как я ожидаю.
Пожалуйста, кто-нибудь может пояснить, что я сделал неправильно здесь?
Асинхронный не распараллеливание кода он просто не блокирует вызывающий поток. – juharr
Хороший ресурс https://msdn.microsoft.com/en-us/magazine/jj991977.aspx - некоторые из примеров должны говорить на ваш случай – Brian
Не используйте 'Thread.Sleep' в вашем асинхронном методе. Используйте 'Task.Delay', чтобы вы фактически не блокировали поток. – mason