Task.Delay и пользовательская задержка на основе DispatcherTimer в WPFC#

Место общения программистов C#
Ответить
Anonymous
 Task.Delay и пользовательская задержка на основе DispatcherTimer в WPF

Сообщение Anonymous »

У меня есть проект WPF, и в некоторых обработчиках асинхронных событий в WMain.xaml.cs я использую метод Task.Delay, чтобы приостановить выполнение обработчика. Пример:

Код: Выделить всё

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
}
}
Интересно, есть ли какие-либо преимущества в замене Task.Delay пользовательской задержкой на основе DispatcherTimer. Например¹:

Код: Выделить всё

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
Получу ли я какую-либо выгоду от использования MyDelay вместо Task.Delay, например, потребление меньшего количества ресурсов или более быстрое реагирование под нагрузкой? Или в конечном итоге оба подхода сводятся к одному и тому же?
Более конкретно, я знаю, что Task.Delay под капотом использует ThreadPool и инфраструктуру таймера System.Threading. Использует ли DispatcherTimer ту же инфраструктуру или он основан на каком-то другом устройстве, специфичном для WPF?
¹ Пример упрощен. В моем реальном проекте WPF MyDelay — это метод расширения класса DispatcherObject (от которого получены Window и UserControl), чтобы минимизировать риск того, что он будет вызван в потоке, отличном от пользовательского интерфейса, и не будет работать (суть).

Подробнее здесь: https://stackoverflow.com/questions/798 ... lay-in-wpf
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»