[英]C#, background worker class
當我編譯此代碼時,我得到了他的錯誤,對象引用設置為null,並且錯誤位置在Dowork中,argumentstest.valueone = 8;。
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);
}
}
argumenttest
test最終有兩種可能為null
:
argumenttest
作為null
發送到RunWorkerAsync
。
e.Argument as test;
e.Argument
是與test
不兼容的東西, as
運算符使它為null
。
很難看到哪一個,因為上面的代碼示例已經很混亂。
編輯
您可以確認您的代碼與decyclone 完全一樣嗎? 在這種情況下,它看起來還不錯,並且據我所知應該可以正常工作。
在DoWork方法的第一行上設置一個斷點,並且在調試時,您應該可以將e.Argument
懸停在e.Argument
上輕松查看1.還是2.是問題。
我看到的一個問題是您在運行工作程序之前未設置事件處理程序,因此這兩行
bgw1.DoWork += bgw1_DoWork;
bgw1.RunWorkerCompleted += bgw1_RunWorkerCompleted;
必須先打電話
bgw1.RunWorkerAsync(test1);
您應該在窗體加載中或在調用RunWorkerAsync之前訂閱DoWork和RunCompleted。
bgw1.DoWork += bgw1_DoWork;
bgw1.RunWorkerCompleted += bgw1_RunWorkerCompleted;
將以上各行從Button Click事件處理程序移至Form_Load。
並移動bgw1.RunWorkerAsync(test1);
從Form Load方法中單擊單擊處理程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.