如何在状态栏中调用进度条?

时间:2011-06-28 00:46:11

标签: c# .net multithreading

我使用以下代码调用应用程序中主UI线程上的控件。我在Status Strip中的进度条没有InvokeRequired,我需要以某种方式调用System.Windows.Forms.ToolStripProgressBar。

if (txtbox1.InvokeRequired)
{
txtbox1.Invoke(new MethodInvoker(delegate { txtbox1.Text = string.Empty; }));
}

4 个答案:

答案 0 :(得分:7)

尝试

if (toolStripProgressBar1.Parent.InvokeRequired)
{
    toolStripProgressBar1.Parent.Invoke(new MethodInvoker(delegate { toolStripProgressBar1.Value= 100; }));
}

答案 1 :(得分:3)

尝试使用这个方便的扩展方法:

public static class ControlEx
{
    public static void Invoke(this System.Windows.Forms.Control @this, Action action)
    {
        if (@this == null) throw new ArgumentNullException("@this");
        if (action == null) throw new ArgumentNullException("action");
        if (@this.InvokeRequired)
        {
            @this.Invoke(action);
        }
        else
        {
            action();
        }
    }
}

现在你可以这样做:

txtbox1.Invoke(() => toolStripProgressBar1.Value = value);

它可以安全地调用UI线程上的操作,并且可以从任何实际控件中调用。

答案 2 :(得分:2)

尝试调用ToolStrip而不是ToolStripProgressBar:

    delegate void ToolStripPrograssDelegate(int value);
    private void ToolStripPrograss(int value)
    {
        if (toolStrip1.InvokeRequired)
        {
            ToolStripPrograssDelegate del = new ToolStripPrograssDelegate(ToolStripPrograss);
            toolStrip1.Invoke(del, new object[] { value });
        }
        else
        {
            toolStripProgressBar1.Value = value; // Your thingy with the progress bar..
        }
    }

我不确定它会起作用,但是试一试。

如果这不起作用,试试这个:

    delegate void ToolStripPrograssDelegate(int value);
    private void ToolStripPrograss(int value)
    {
        if (this.InvokeRequired)
        {
            ToolStripPrograssDelegate del = new ToolStripPrograssDelegate(ToolStripPrograss);
            this.Invoke(del, new object[] { value });
        }
        else
        {
            toolStripProgressBar1.Value = value; // Your thingy with the progress bar..
        }
    }

'this'应该是它自己的形式。

答案 3 :(得分:1)

您可以从旨在调用任何 Control Automating the InvokeRequired code pattern更改泛型调用者:

//Neat generic trick to invoke anything on a windows form control class  
//https://stackoverflow.com/questions/2367718/automating-the-invokerequired-code-pattern
//Use like this:
//object1.InvokeIfRequired(c => { c.Visible = true; });
//object1.InvokeIfRequired(c => { c.Text = "ABC"; });
//object1.InvokeIfRequired(c => 
//  { 
//      c.Text = "ABC";
//      c.Visible = true; 
//  }
//);
public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control
{
    if (c.InvokeRequired)
    {
        c.Invoke(new Action(() => action(c)));
    }
    else
    {
        action(c);
    }
}

ToolStrip中的对象是 ToolStripItem ,没有InvokeRequired。但是父母已经和上面的内容可以被重写以使用父.Invoke():

public static void InvokeIfRequiredToolstrip<T>(this T c, Action<T> action) where T : ToolStripItem
{
    if (c.GetCurrentParent().InvokeRequired)
    {
        c.GetCurrentParent().Invoke(new Action(() => action(c)));
    }
    else
    {
        action(c);
    }
}