почему этот код фонового работника вызывает эту ошибку: Несоответствие количества параметров - PullRequest
1 голос
/ 20 февраля 2010

что не так с этим кодом ниже? Conn_PageDeleted исходит из фонового потока, и я пытаюсь обновить метку каждый раз, когда я получаю обратный вызов. Я получаю сообщение об ошибке

Несоответствие количества параметров.

Вот код:

    private void cmdDeletePage_Click(object sender, EventArgs e)
    {
         worker = new BackgroundWorker();
         worker.DoWork += new DoWorkEventHandler(worker_DoWork);
         worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
         worker.RunWorkerAsync();
    }

    void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        lblDeleteStatus.Text = "";
        MessageBox.Show("Complete");
    }

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        Connecter conn = new Connecter("a", "m");
        conn.PageDeleted += new Connecter.PageDeletedHandler(conn_PageDeleted);
        bool success = conn.DeletePage(txtPageToDelete.Text, chkRecursive.Checked);
    }


    public delegate  void UpdateLabelHandler(object sender, string name);

    void conn_PageDeleted(object sender, string name)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new UpdateLabelHandler(UpdateMe));
        }
        else
        {
            lblDeleteStatus.Text = name;                
        }
    }

    private void UpdateMe(object sender_, string name_)
    {
        lblDeleteStatus.Text = name_;
    }

Ответы [ 2 ]

2 голосов
/ 20 февраля 2010

Вы должны передать параметры методу UpdateMe, попробуйте это:

void conn_PageDeleted(object sender, string name)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new UpdateLabelHandler(UpdateMe), new object[] {sender, name}); //<-- the update goes here
        }
        else
        {
            lblDeleteStatus.Text = name;                
        }
    }
1 голос
/ 20 февраля 2010

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

public delegate void UpdateLabelHandler(object sender, string strArgs);

Редактировать: Так как вы отредактировали код, чтобы включить это ... Я исправлю это соответственно ... Глядя на ваш отредактированный код, я должен задать вопрос:

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        Connecter conn = new Connecter("a", "m");
        conn.PageDeleted += new Connecter.PageDeletedHandler(conn_PageDeleted);
        bool success = conn.DeletePage(txtPageToDelete.Text, chkRecursive.Checked);
    }

Вы подключаете обработчик события «PageDeleted» .... и после него вызываете метод «DeletePage», я предполагаю, что, в свою очередь, вызывает обработчик события «conn_PageDeleted» в теле «DoWork», он выходит из области видимости когда поток 'BackgroundWorker' завершен ... и так как 'conn' находится в локальной области действия метода 'worker_DoWork', он уничтожается, и каким-то образом ваш обработчик событий портится! Вы можете это подтвердить?

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

...