如何将带参数的函数委托给C#中的其他线程?
如果我自己尝试,我会收到此错误:
error CS0149: Method name expected
这就是我现在所拥有的:
delegate void BarUpdateDelegate();
private void UpdateBar(int Value,int Maximum,ProgressBar Bar)
{
if (Bar.InvokeRequired)
{
BarUpdateDelegate Delegation = new BarUpdateDelegate(Value, Maximum, Bar); //error CS0149: Method name expected
Bar.Invoke(Delegation);
return;
}
else
{
Bar.Maximum = Maximum;
Bar.Value = Value;
//Insert the percentage
int Percent = (int)(((double)Value / (double)Bar.Maximum) * 100);
Bar.CreateGraphics().DrawString(Percent.ToString() + "%", new Font("Arial", (float)8.25, FontStyle.Regular), Brushes.Black, new PointF(Bar.Width / 2 - 10, Bar.Height / 2 - 7));
return;
}
}
我想从另一个线程更新主线程中的进度条。
答案 0 :(得分:3)
您没有使用参数初始化委托:
BarUpdateDelegate Delegation = new BarUpdateDelegate(Value, Maximum, Bar); //error CS0149: Method name expected
Bar.Invoke(Delegation);
相反,将这些参数传递给Invoke
。
BarUpdateDelegate delegation = new BarUpdateDelegate(UpdateBar);
Bar.Invoke(delegation, Value, Maximum, Bar);
您还需要在委托定义中指定这些参数。但是,有一种更简单的方法,使用内置的Action<...>
委托。我还做了其他一些代码改进。
private void UpdateBar(int value, int maximum, ProgressBar bar)
{
if (bar.InvokeRequired)
{
bar.Invoke(new Action<int, int, ProgressBar>(UpdateBar),
value, maximum, bar);
}
else
{
bar.Maximum = maximum;
bar.Value = value;
// Insert the percentage
int percent = value * 100 / maximum;
bar.CreateGraphics().DrawString(percent.ToString() + "%", new Font("Arial", 8.25f, FontStyle.Regular), Brushes.Black, bar.Width / 2 - 10, bar.Height / 2 - 7);
}
}
答案 1 :(得分:0)
这不是有效的代码:
BarUpdateDelegate Delegation = new BarUpdateDelegate(Value, Maximum, Bar);
请参阅MSDN Delegates documentation作为起点。