簡體   English   中英

C#,后台工作者類

[英]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

  1. argumenttest作為null發送到RunWorkerAsync

  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM