C# 为什么此backgroundworker代码会导致此错误:参数计数不匹配
下面的代码有什么问题?conn_PageDeleted来自一个后台线程,每次回电话时我都会尝试更新标签。我得到一个错误声明 参数计数不匹配。 代码如下: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
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块中以帮助您。。。