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_;
    }
4

2 回答 2

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;                
        }
    }
于 2010-02-20T08:07:23.677 回答
1

您的委托必须匹配事件处理程序的签名,如下所示:

公共委托无效UpdateLabelHandler(对象发送者,字符串strArgs);

编辑:既然你已经编辑了代码以包含这个......我会相应地修改这个......看看你编辑的代码,我不得不质疑这个:

    void worker_DoWork(对象发送者,DoWorkEventArgs e)
    {
        连接器 conn = new Connecter("a", "m");
        conn.PageDeleted += new Connecter.PageDeletedHandler(conn_PageDeleted);
        bool 成功 = conn.DeletePage(txtPageToDelete.Text, chkRecursive.Checked);
    }

您正在连接一个“PageDeleted”事件处理程序......并在它之后调用“DeletePage”方法,我假设反过来在“DoWork”主体内调用事件处理程序“conn_PageDeleted”,当“ BackgroundWorker' 线程已完成......并且由于 'conn' 在 'worker_DoWork' 方法的本地范围内,它会被破坏,并且您的事件处理程序会以某种方式搞砸!你能证实这一点吗?

希望这会有所帮助,最好的问候,汤姆。

于 2010-02-20T03:31:52.030 回答