отменить исключение фонового работника в e.result - PullRequest
5 голосов
/ 28 ноября 2011

У меня серьезная проблема с фоновым работником. код работает, если задача заканчивается регулярно. когда я отменяю фоновую задачу, я получаю исключение system.invalidoperationexception в функции RunWorkerCompleted для e.Result. что случилось? спасибо.

вот моя треска:

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
  if (backgroundWorker.CancellationPending == true)
    e.Cancel = true;
  e.Result = resultList;
}


private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  if (e.Error != null)
    List<Object> resultList = (List<Object>)e.Result;
} 

Ответы [ 2 ]

6 голосов
/ 28 ноября 2011

Это предусмотрено, что средство получения свойства Result выдает, когда DoWork был отменен или выдал исключение.Просто проверьте это:

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (!e.Cancelled && e.Error == null) {
       List<Object> resultList = (List<Object>)e.Result;
       // etc..
    }
} 
0 голосов
/ 17 января 2017

После долгой борьбы (будучи новичком) мне удалось включить предложение @ Ганса в мой код.Надеюсь, что следующий блок кода поможет новичкам, таким как я, которые хотят возвращать обработанные в данный момент результаты при вызове cancellasync ().

Блок кода

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.ComponentModel;
using System.Data;

namespace CancelBackgroundWorker
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private BackgroundWorker worker = null;

        public MainWindow()
        {
             InitializeComponent();
                        worker = new BackgroundWorker();
                        worker.WorkerSupportsCancellation = true;
                        worker.WorkerReportsProgress = true;
                        worker.DoWork += worker_DoWork;
                        worker.ProgressChanged += worker_ProgressChanged;
                        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
        }


                private void btnStart_Click(object sender, RoutedEventArgs e)
                {
                        worker.RunWorkerAsync();
                }

                private void btnCancel_Click(object sender, RoutedEventArgs e)
                {
                    worker.CancelAsync();


                }

                void worker_DoWork(object sender, DoWorkEventArgs e)
                {

                    for(int i = 0; i <= 100; i++)
                        {
                                if(worker.CancellationPending == true)
                                {
                                    ///4121452/otmenit-isklychenie-fonovogo-rabotnika-v-e-result
                                      //  e.Cancel = true; //This does the trick
                                        e.Result = 100;
                                        return;
                                }
                                worker.ReportProgress(i);
                                System.Threading.Thread.Sleep(250);

                        }
                        e.Result = 42;

                }

                void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
                {
                        lblStatus.Text = "Working... (" + e.ProgressPercentage + "%)";
                }

                void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
                {
                        if(e.Cancelled)
                        {
                                lblStatus.Foreground = Brushes.Red;
                                lblStatus.Text = "Cancelled by user..." + e.Result;

                        }
                        else
                        {
                                lblStatus.Foreground = Brushes.Green;
                                lblStatus.Text = "Done... Calc result: " +e.Result;

                        }
                }

    }
}
...