2011-02-09 80 views
2

当我编译此代码时,我得到他的错误,对象引用设置为null,并且错误位置在Dowork,argumenttest.valueone = 8;C#,后台工作者类

public partial class Form1 : Form 
{ 
    BackgroundWorker bgw1 = new BackgroundWorker(); 
    public Form1() 
    { 
     InitializeComponent(); 
     // bgw1.RunWorkerAsync(test1); 

     test test1 = new test 
     { 
      valueone = 5, 
      valuetwo = 10 
     }; 
     bgw1.RunWorkerAsync(test1); 
    } 

    class test 
    { 

     public int valueone { get; set; } 
     public int valuetwo { get; set; } 
    } 

    private void bgw1_DoWork(Object sender, DoWorkEventArgs e) 
    { 
     test argumenttest = e.Argument as test; 
     Thread.Sleep(10); 

     argumenttest.valueone = 8; 
     argumenttest.valuetwo = 10; 

     e.Result = argumenttest; 
    } 

    private void bgw1_RunWorkerCompleted(Object sender, RunWorkerCompletedEventArgs e) 
    { 
     test test12 = e.Result as test; 
     button1.Text = test12.valueone.ToString();// +test.valuetwo.ToString(); 
     //this.Text = test.valueone.ToString() + " "+ test.valuetwo.ToString(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 

     bgw1.DoWork += bgw1_DoWork; 
     bgw1.RunWorkerCompleted += bgw1_RunWorkerCompleted; 
     //bgw1.RunWorkerAsync(test); 

    } 
} 
+1

您是否可以在代码中更频繁地使用单词测试? ;) – thumbmunkeys 2011-02-09 11:26:03

+0

@ Henk HolterMan:我只是新来的这个背景工作者(线程),我在实践它之前就做了一些实践工作。 – safi 2011-02-09 11:31:19

回答

4

有两种可能的方式argumenttest最终成为null

  1. argumenttest被送往作为nullRunWorkerAsync

  2. e.Argument as test;e.Argument的东西不符合testas操作使得null

很难看出哪一个,因为上面的代码示例是相当混乱的。

编辑

你能确认你的代码是正是作为decyclone编辑呢?在那种情况下,它看起来很好,应该尽我所能地工作。

在DoWork方法的第一行设置一个断点,并且在调试时应该很容易地看到1或2是否通过悬停在e.Argument上而出现问题。

1

的一个问题,我看到的是,您在运行工人之前不设置事件处理程序,所以这两条线

bgw1.DoWork += bgw1_DoWork; 
    bgw1.RunWorkerCompleted += bgw1_RunWorkerCompleted; 

已到之前

bgw1.RunWorkerAsync(test1); 
1

你应该叫在表单加载中或在调用RunWorkerAsync之前订阅DoWork和RunCompleted。

bgw1.DoWork += bgw1_DoWork; 
bgw1.RunWorkerCompleted += bgw1_RunWorkerCompleted; 

将上述行从Button Click事件处理程序移到Form_Load。

并将bgw1.RunWorkerAsync(test1);移动到按钮单击处理程序从窗体加载方法。