2014-11-19 3 views
1
private void button_uploadToPI_Click(object sender, RoutedEventArgs e) 
    { 


     this.newFilePath = this.textbox_input_filePath.Text; 
     this.label_status.Content = ""; 
     if (bgWorker.IsBusy != true) 
     { 


      bgWorker.RunWorkerAsync(); 
     } 
    } 

여기 내 클릭 이벤트입니다.백그라운드 작업자가 doWork를 여러 번 실행합니다.

public MainWindow() 
    { 

     InitializeComponent(); 

     this.progressBar.Minimum = 0; 
     this.progressBar.Maximum = 100; 

     this.bgWorker = new BackgroundWorker(); 

     this.bgWorker.WorkerReportsProgress = true; 
     this.bgWorker.WorkerSupportsCancellation = true; 
     reader.IsOpen = false; 

     this.bgWorker.DoWork += bgWorker_DoWork; 
     this.bgWorker.ProgressChanged += bgWorker_ProgressChanged; 
     this.bgWorker.RunWorkerCompleted += bgWorker_RunWorkerCompleted; 
    } 

주 창 방법.

public partial class MainWindow : Window 
{ 

    private BackgroundWorker bgWorker; 

여기서 bgWorker가 초기화됩니다.

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 

     this.progressBar.Value = 0; 
     this.label_progressPercentage.Content = "0%"; 
     reportTextBox.ScrollToEnd(); 
    } 

RunWorkComplete 코드

주요 문제는 내가 한 번 응용 프로그램을 실행하면 예상대로 작동이다. 그런 다음 다시 클릭하면 메서드가 두 번 실행되고 다시 클릭하면 메서드가 3 번 실행됩니다. 새로운 클릭이 증가 할 때마다 증가 할 것입니다.

누구든지 주요 문제는 여기에서 볼 수 있습니까?

+0

게시 된 코드에는 아무런 문제가 없습니다. BackgroundWorker에 대한 이벤트 처리기를 게시 할 수 있습니까? – Bridge

+0

내 runworkcomplete 메소드에 대한 코드를 추가했습니다. – Andrew

+0

"다시 클릭하십시오"라는 말은'button_uploadToPI'를 클릭 하시거나 폼 자체를 다시 보여 주시겠습니까? –

답변

2

@ galenus의 제안에 반대하는 샘플을 작성했습니다. 나는 배경 작업자와 동일한 상황을 겪었고 버튼을 사용하여 작업자를 초기화 할 때까지 dowork을 여러 번 실행하는 작업 버튼을 클릭했다. 코드 블록 :

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 MouseClick 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 



     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     public BackgroundWorker worker = new BackgroundWorker(); 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      //e.Handled = true; // Din't do anything 
      worker = new BackgroundWorker(); //stopped the dowork being executed multiple times when button pressed again in the same session 
      worker.WorkerReportsProgress = true; 
      worker.WorkerSupportsCancellation = true; 
      worker.DoWork += worker_DoWork; 
      worker.ProgressChanged += worker_ProgressChanged; 
      worker.RunWorkerCompleted += worker_RunWorkerCompleted; 
      worker.RunWorkerAsync(); 

     } 

     void worker_DoWork(object sender, DoWorkEventArgs e) 
     { 


      int tot = 1; 

      MessageBox.Show(tot.ToString()); //if this message box appears multiple times, it means the dowork is executing multiple times 

      DataTable dt = new DataTable(); 

      dt.Columns.Add("Running Number"); 

      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(1); 
       dt.Rows.Add(i); 
      } 
      e.Result = dt; 
     } 

     #region "worker_ProgressChanged" 
     void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 

     } 
     #endregion 

     #region "worker_RunWorkerCompleted" 
     void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      myGrid.ItemsSource = ((DataTable)e.Result).DefaultView; 
      worker.Dispose(); 

     } 
     #endregion 

    } 
} 
관련 문제