C #, фоновый рабочий класс - PullRequest
       0

C #, фоновый рабочий класс

2 голосов
/ 09 февраля 2011

когда я компилирую этот код, я получаю его ошибку, ссылка на объект устанавливается на ноль, а местоположение ошибки в Dowork, аргументtest.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);

    }
}

Ответы [ 3 ]

4 голосов
/ 09 февраля 2011

Существует два возможных способа: argumenttest заканчивается как null:

  1. argumenttest было отправлено как null в RunWorkerAsync.

  2. e.Argument as test; e.Argument не соответствует test, а оператор as делает его null.

Трудно увидетькакой, так как ваш пример кода выше очень запутался.

РЕДАКТИРОВАТЬ

Можете ли вы подтвердить, что ваш код точно , как дециклон редактировал?В этом случае он выглядит нормально и, насколько я вижу, должен был сработать.

Установите точку останова в первой строке метода DoWork, и при отладке вы сможете легко увидеть, если 1.или 2. проблема в том, что завис над e.Argument.

1 голос
/ 09 февраля 2011

Вы должны подписаться на DoWork и RunCompleted при загрузке формы или перед вызовом RunWorkerAsync.

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

переместите вышеуказанные строки в Form_Load из обработчика событий Button Click.

Ипереместите bgw1.RunWorkerAsync(test1); в обработчик нажатия кнопки из метода загрузки формы.

1 голос
/ 09 февраля 2011

Одна проблема, которую я вижу, состоит в том, что вы не устанавливаете обработчик событий до запуска работника, поэтому эти 2 строки

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

должны быть вызваны до

    bgw1.RunWorkerAsync(test1);
...