1

由于某种原因,ToolStrip 的 ProgressBar 和 Label 没有从其他线程更新。经过大量阅读后,我想出了这个,但仍然无法正常工作(按钮还可以,但不在状态栏上)。

    public void GdmReaderMessageEvent(object sender, GdmMessagesEventArgs e)
    {
        Console.WriteLine(e.Message);

        // error or abort
        if (e.Message.StartsWith("Error:") || e.Message.StartsWith("Aborted"))
        {

            // cross thread crap
            if (pb.GetCurrentParent().InvokeRequired)
                pb.GetCurrentParent().Invoke(new MethodInvoker(delegate { pb.Visible = false; }));

            if (lblStatus.GetCurrentParent().InvokeRequired)
                lblStatus.GetCurrentParent().Invoke(new MethodInvoker(delegate { lblStatus.Text = e.Message; }));

            btnImport.Invoke(new MethodInvoker(delegate { btnImport.Text = "Import"; }));

            //lblStatus.Text = e.Message;
            //btnImport.Text = "Import";
            //pb.Visible = false;
        }
    }

已编辑,现在所有功能,但这只是来自 BGW 线程的回调,我认为这已经很明显了。如果我只使用它:

        lblStatus.Text = e.Message;  // this is a Label inside Status
        btnImport.Text = "Import";   // this is just a button on Form
        pb.Visible = false;          // this is a Progress Bar inside Status    

将抛出跨线程错误。所以这就是我使用 Invoke() 的原因。现在按钮可以更新,但状态栏中的所有控件都不能更新。

希望现在更加清晰。

我使用 .NET 3.5、VS2008、Winforms。有什么解决办法吗?

4

1 回答 1

0

好的,我找到了。@Fixation,感谢您用“这个”指导我(我的意思是表单本身)。我试图使用无效的控制调用。

此外,这篇文章很有用, 无法使用 C# 中的线程更新进度条

        this.BeginInvoke((Action)(() => pb.Visible = false));
        this.BeginInvoke((Action)(() => lblStatus.Text = e.Message));

简直完美,谢谢。

于 2017-05-09T14:20:37.650 回答