C# 为什么此backgroundworker代码会导致此错误:参数计数不匹配

C# 为什么此backgroundworker代码会导致此错误:参数计数不匹配,c#,multithreading,begininvoke,C#,Multithreading,Begininvoke,下面的代码有什么问题?conn_PageDeleted来自一个后台线程,每次回电话时我都会尝试更新标签。我得到一个错误声明 参数计数不匹配。 代码如下: private void cmdDeletePage_Click(object sender, EventArgs e) { worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandler(worker_DoWo

下面的代码有什么问题?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_;
    }

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

public delegate void UpdateLabelHandler(object sender, string strArgs); 公共委托void UpdateLabelHandler(对象发送方,字符串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); } 无效工作线程(对象发送器,工作线程目标) { 接头连接=新接头(“a”、“m”); conn.PageDeleted+=新连接器.PageDeletedHandler(conn_PageDeleted); bool success=conn.DeletePage(txtPageToDelete.Text,chkRecursive.Checked); } 您正在连接一个“PageDeleted”事件处理程序…并在它之后调用“DeletePage”方法,我假定反过来调用“DoWork”主体中的事件处理程序“conn_PageDeleted”,当“BackgroundWorker”线程完成时,它将超出范围…并且由于“conn”位于“worker_DoWork”方法的本地范围内,因此会被销毁,不知怎的,你的事件处理程序搞砸了!你能证实这一点吗

希望这有帮助, 顺致敬意,
Tom。

您应该将参数传递给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;                
        }
    }
void conn\u PageDeleted(对象发送方,字符串名称)
{
if(this.invokererequired)
{

this.BeginInvoke(new UpdateLabelHandler(UpdateMe),new object[]{sender,name});//您能说明如何在代码中调用conn_PageDeleted吗(请也包括线程代码)?看起来不错…从我现在看到的地方…@tommieb75-我已经添加了所有code@oo:您可以显示conn.DeletePage方法吗?@tommieb75-为什么这很重要线程本身可能存在竞争条件,调用DeletePage后,线程超出范围,然后触发事件,它可能/可能不会被您的线程捕获事件处理程序并因此爆炸…这就是我的感觉…您是否尝试过在“worker\u DoWork”方法的末尾添加延迟,可能是线程.Sleep()?这将确认您的事件在延迟后得到处理并正常工作。如果没有,钱不知何故就在DeletePage上。请将代码包装在try/catch块中以帮助您。。。