使用C#中的参数委托其他线程

时间:2012-07-24 17:13:51

标签: c# windows multithreading

如何将带参数的函数委托给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;
        }
    }

我想从另一个线程更新主线程中的进度条。

2 个答案:

答案 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作为起点。