2017-05-31 36 views
3

我已经创建了一个使用后台工作的c#项目。它包含一个用于启动后台工作者的“开始”按钮。这是我的代码。后台工作人员持续运行问题c#

using System.Threading.Tasks; 
using System.Windows; 

namespace Test 
{ 

    public partial class MainWindow : Window 
    { 

     int status = 0; 

     private void btnstart_Click(object sender, RoutedEventArgs e) 
     { 

      worker.DoWork += worker_DoWork; 
      worker.RunWorkerCompleted += worker_RunWorkerCompleted; 
      worker.RunWorkerAsync(); 
      Console.WriteLine("Background worker started successfully"); 
      btnsave.IsEnabled = false; 
     } 

     private void worker_DoWork(object sender, DoWorkEventArgs e) 
     { 

       if (worker.CancellationPending) 
       { 
        e.Cancel = true; 
        return; 
       } 
       Console.WriteLine("Status : " + status); 
       if (status == 0) 
       { 
        status = 1; 
       } 
     } 

     private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      Console.WriteLine("worker completed"); 
      btnsave.IsEnabled = true; 
     } 
    } 
} 

但每一次,我有点击启动按钮,我得到的输出喜欢这个

attempt 1. 

Status : 0 
The thread 0x23dc has exited with code 0 (0x0). 
Status : 1 


attempt 2. 

Status : 0 
The thread 0x148 has exited with code 0 (0x0). 
Status : 1 
Status : 1 

attempt 3. 

Status : 0 
The thread 0x128 has exited with code 0 (0x0). 
Status : 1 
Status : 1 
Status : 1 

我开始对现有工人只完成后,后台工作。那么为什么“状态”日志正在像这样打印。

+2

正在注册的事件处理程序多次,没有_unregistering_。所以do工作事件处理程序被多次调用。 – kennyzx

回答

7

问题结果从事件处理程序分配:

worker.RunWorkerCompleted += worker_RunWorkerCompleted; 

这样做是你单击按钮每次。因为它+ +你多次分配它。

只需添加窗口初始化事件处理程序:

using System.Threading.Tasks; 
using System.Windows; 

namespace Test 
{ 

    public partial class MainWindow : Window 
    { 

     int status = 0; 

     // should be called when the window is loaded 
     private void ApplicationStart() 
     { 
      worker.DoWork += worker_DoWork; 
      worker.RunWorkerCompleted += worker_RunWorkerCompleted; 
     } 

     private void btnstart_Click(object sender, RoutedEventArgs e) 
     {    
      worker.RunWorkerAsync(); 
      Console.WriteLine("Background worker started successfully"); 
      btnsave.IsEnabled = false; 
     } 

     private void worker_DoWork(object sender, DoWorkEventArgs e) 
     { 

       if (worker.CancellationPending) 
       { 
        e.Cancel = true; 
        return; 
       } 
       Console.WriteLine("Status : " + status); 
       if (status == 0) 
       { 
        status = 1; 
       } 
     } 

     private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      Console.WriteLine("worker completed"); 
      btnsave.IsEnabled = true; 
     } 
    } 
} 
+0

感谢罗马诺Zumbe,它工作正常 –