2011-11-28 2 views
3

배경 작업자에게 심각한 문제가 있습니다. 작업이 정기적으로 끝나면 코드가 작동합니다. 백그라운드 작업을 취소하면 e.Result의 RunWorkerCompleted 함수에서 system.invalidoperationexception이 발생합니다. 뭐가 잘못 되었 니? 고맙습니다. DoWork 취소하거나 예외를 던져 때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; 
} 

답변

5

이것은 의도적으로 설계된, Result 속성 게터가 발생합니다 :

여기 내 대구입니다. 단순히 확인 :

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

확인 아,하지만 난이 취소 된 경우 이벤트를 초래할 필요하면 무엇을해야 하는가? – user1069951

+1

이것을 조금 생각해보십시오 : DoWork가 예외에 의해 중단되거나 인터럽트되면 유효한 결과를 가질 수 없습니다. 그것은 끝나지 않았다. –

+0

의도에 의해 취소됩니다. 사용자가 시간 소모적 인 작업을 중단 한 다음 backgroundWorker.CancelAsync()가 호출됩니다. 아직 예외가 아닙니다. 나는 현재 사용자에게 결과를 제시하고자한다. 어떻게 할 수 있습니까? 단서 없음 – user1069951

0

을 내 코드 한스의 제안 @ 통합 관리 긴 투쟁 (초보자 인) 후. 다음 코드 블록은 cancelasync()가 호출 될 때 현재 처리 된 결과를 반환하려는 나 같은 초보자에게 도움이되기를 바랍니다.

코드 블록

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) 
           { 
            //http://stackoverflow.com/questions/8300799/cancel-background-worker-exception-in-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; 

         } 
       } 

    } 
}