Come eseguire l’attività nello sfondo wpf mentre è in grado di fornire report e consentire l’annullamento?

Voglio eseguire un’attività di lunga durata dopo aver fatto clic su un pulsante wpf. Ecco cosa ho fatto.

private void Start(object sender, RoutedEventArgs e) { for (int i = 0; i < 10; i++) { Thread.Sleep(2000); // simulate task } } 

Il problema è che questo renderà wpf gui insensibile. Vorrei anche consentire la cancellazione e segnalare i progressi ogni 1 secondo. Espandere il codice come di seguito.

  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; } 

La mia piattaforma di destinazione è .NET 4.5. Qual è il modo consigliato per farlo?

Grazie.