首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#工具条的进度条和标签没有从跨线程操作中更新

C#工具条的进度条和标签没有从跨线程操作中更新
EN

Stack Overflow用户
提问于 2017-05-09 13:05:18
回答 1查看 1K关注 0票数 1

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

代码语言:javascript
运行
复制
    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线程,我认为这已经很明显了。如果我只是用这个:

代码语言:javascript
运行
复制
        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。有解决办法吗?

EN

回答 1

Stack Overflow用户

发布于 2017-05-09 14:20:37

好吧,我找到了。@ for,谢谢你给我指点“这个”(我的意思是表单本身)。我试着使用无法工作的控制调用。

另外,这篇文章是有用的unable to update progress bar with threading in C#

代码语言:javascript
运行
复制
        this.BeginInvoke((Action)(() => pb.Visible = false));
        this.BeginInvoke((Action)(() => lblStatus.Text = e.Message));

太完美了,谢谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43870659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档