多线程C#程序中不可靠的GUI更新

时间:2013-12-18 15:21:15

标签: c# multithreading mono gtk#

我有一个程序在一个窗口中的其他线程中运行一系列方法,让用户知道使用状态栏发生了什么。状态栏更新位于主线程中,该主线程设置状态栏,然后刷新GUI。串联的代码块有几个,每个代码都是这样的:

Thread do1Thread = new Thread(Class.Method);
do1Thread.Start();
// inform user
this.status.Text = "Doing stuff 1...";
// update GUI
Utility.RefreshGUI();
// join thread
do1Thread.Join();

有时状态栏确实会更新但通常会保持在第一个状态,直到显示最后一个状态结束。偶尔会坚持“准备好”。这是默认值。

请注意,其中两个块需要几秒钟,因此应该有时间进行更新。此外,程序是用C#(Mono)编写的,使用GTK#作为GUI。

如何确保GUI更新以反映更改?

5 个答案:

答案 0 :(得分:2)

问题是Join()调用阻止阻止所有窗口消息的UI线程。

您可以使用BackgroundWorker并在RunWorkerCompleted调用中加入后执行您拥有的任何代码吗?

答案 1 :(得分:1)

您需要将更新消息发送到UI线程,调用invoke而不是直接属性

this.status.BeginInvoke((Action)(() => this.status.Text = "Something happen"));

答案 2 :(得分:1)

我发现在主线程中更新控件的最佳方法是设置一个委托进行更新,并从其他线程调用该委托。

答案 3 :(得分:0)

你必须使用观察和可观察的模式。

编辑:

分割逻辑和查看部分代码真的更好。

以下是现实世界中如何使用的示例。 Pattern

答案 4 :(得分:-1)

您可以检查一下是否使用了StatusStrip控件吗? 如果是这样,您的代码就像直接设置Stautus Strip Control文本

this.status.Text = "Doing stuff 1...";

因此它不会在状态条中反映为文本。您必须放置一个toolstriplabel,并且需要在这种情况下设置其文本。

请查看帖子here