Код: Выделить всё
private async void Window_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
// Some UI code
await Task.Delay(1000);
// Some more UI code
}
}
Код: Выделить всё
static Task MyDelay(int millisecondsDelay)
{
TaskCompletionSource tcs = new();
DispatcherTimer timer = new();
timer.Interval = TimeSpan.FromMilliseconds(millisecondsDelay);
timer.Tick += (s, e) => { timer.Stop(); tcs.SetResult(); };
timer.Start();
return tcs.Task;
}
Код: Выделить всё
// Some UI code
await MyDelay(1000);
// Some more UI code
Более конкретно, я знаю, что Task.Delay под капотом использует ThreadPool и инфраструктуру таймера System.Threading. Использует ли DispatcherTimer ту же инфраструктуру или он основан на каком-то другом устройстве, специфичном для WPF?
¹ Пример упрощен. В моем реальном проекте WPF MyDelay — это метод расширения класса DispatcherObject (от которого получены Window и UserControl), чтобы минимизировать риск того, что он будет вызван в потоке, отличном от пользовательского интерфейса, и не будет работать (суть).
Подробнее здесь: https://stackoverflow.com/questions/798 ... lay-in-wpf
Мобильная версия