Я хочу выполнить долго выполняющуюся задачу после нажатия кнопки wpf. Вот что я сделал.
private void Start(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(2000); // simulate task
}
}
Проблема заключается в том, что wpf gui не отвечает. Я также хотел бы разрешить отмену и отчет о прогрессе каждые 1 секунду. Я расширяю код, как показано ниже.
DispatcherTimer dispatcherTimer = new DispatcherTimer(); // get progress every second
private int progress = 0; // for progress reporting
private bool isCancelled = false; // cancellation
private void Start(object sender, RoutedEventArgs e)
{
InitializeTimer(); // initiallize interval timer
Start(10); // execute task
}
private void InitializeTimer()
{
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0,0,1);
dispatcherTimer.Start();
}
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
Logger.Info("Current loop progress " + progress); // report progress
}
private void Cancel(object sender, RoutedEventArgs e) // cancel button
{
isCancelled = true;
}
private int Start(int limit)
{
isCancelled = true;
progress = 0;
for (int i = 0; i < limit; i++)
{
Thread.Sleep(2000); // simulate task
progress = i; // for progress report
if (isCancelled) // cancellation
{
break;
}
}
return limit;
}
Моя целевая платформа -.NET 4.5. Каков рекомендуемый способ сделать это?
Спасибо.