【发布时间】:2014-03-17 16:10:55
【问题描述】:
我创建了一个简单的 WindowsForms 应用程序,其中有一个 button 和一个 label。
如果我单击按钮,则标签应显示从 1 到 100000 的数字。
但是如果我点击button,那么GUI 会冻结,直到程序计数到 100000,然后标签显示 100000,并且 GUI 停止冻结。
从 1 到 100000 的计数在新线程(不是 GUI 线程)中执行,然后更改 labeltext 我尝试使用 BeginInvoke,但它不起作用...
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
new Thread(DoSomethingExpensive).Start();
}
void DoSomethingExpensive() {
for (int i = 0; i < 100000; i++) {
this.label1.BeginInvoke((Action)(() => {
label1.Text = "" + i;
}
));
}
}
}
}
【问题讨论】:
-
@Vkt0rS。在这种情况下,这不会真正改变任何东西,或者提供任何特别有用的工具。虽然总体上很好,但 BGW 并不是真正为处理这个特殊问题而设计的。
-
@Servy 怎么样?这似乎是为 bgw 设计的确切用例。您想在长时间运行的过程中向 UI 线程发送更新。
-
@DanielMann 您为什么不亲自尝试一下,看看是否可以将此代码重新编写为利用 BGW 工具的有效且可行的解决方案。您会看到它与此问题中的问题完全相同。
标签: c# multithreading user-interface begininvoke