2010-02-20 3 views
1

что не так в этом коде? 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_; 
    } 
+0

Можете ли вы показать, как conn_PageDeleted вызывается в коде (включая код многопоточности, а также, пожалуйста)? Это выглядит нормально ... откуда я смотрю ... – t0mm13b

+0

@ tommieb75 - я добавил весь код – leora

+0

@oo: Можете ли вы показать метод conn.DeletePage? – t0mm13b

ответ

2

Вы должны передать параметры методу 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

Делегат должен соответствовать подписи обработчика события, что-то вроде этого:

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

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

 
    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», который уничтожается, и как-то ваш обработчик событий становится испорченным! Можете ли вы это подтвердить?

Надеюсь, это поможет, С уважением, Tom.

+0

@ tommieb75 - у меня есть (обновлено выше) – leora

+1

В самой ветке может возникнуть условие гонки, после вызова DeletePage поток выходит из области видимости, затем запускается событие, он может/не попасть в ловушку вашего обработчика событий и, следовательно, взорвать ... это мое чувство ... вы пытались добавить задержку в конце метода «worker_DoWork», возможно, Thread.Sleep()? Это подтвердит, что ваше мероприятие обрабатывается и работает после задержки. Если нет, деньги находятся на DeletePage как-то. Завершите код в блоках try/catch, чтобы помочь вам ... – t0mm13b

Смежные вопросы