2011-02-09 105 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);移動到按鈕單擊處理程序從窗體加載方法。