标签中的循环bug
好吧,很简单,创建一个窗口窗体,放入一个按钮和一个标签,并给这个按钮一个点击事件。标签中的循环bug
private void button1_Click(object sender, EventArgs e)
{
int xa;
int ya;
for (xa = 647; xa < 982; xa++)
for (ya = 262; ya < 598; ya++)
{
label1.Text = xa.ToString() + " " + ya.ToString();
}
}
和程序只是约20秒,当我点击按钮。我怎样才能解决这个问题?
你必须从UI线程中获得它。试试这个:
private void button1_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(p => doit());
}
private void doit()
{
int xa;
int ya;
for (xa = 647; xa < 982; xa++)
for (ya = 262; ya < 598; ya++)
{
this.Invoke(new Action(() => { label1.Text = xa.ToString() + " " + ya.ToString(); }));
}
}
中发现了一个类似的问题,这个变化所做的唯一的事情是,由于线程之间不断的回调,使得它变得更慢......不知道这将是多么有帮助。 .. –
@AlexeiLevenkov - 速度较慢,真实。线程编组并不便宜。这取决于目标是什么。我认为OP正试图在处理时处理无响应的UI。 – sarme
工作线程上的小睡会给UI线程渲染机会......显然不是最好的解决方案(应该使用计时器),但是没问题。 –
发生这种情况是因为你在UI线程上做了一个很长的任务。看看'BackgroundWorker','async'和'StringBuilder'作为奖励。 – SimpleVar
现在你的问题是“如果你运行需要花费一些时间和重复多次的代码,需要很长时间,如何修复它?”你可能想澄清你实际上想要达到什么... –
我没有看到我放入按钮是一个长期的任务,它只是一个300x300的运行,但我想在这个程序中看到的是,y在程序中立即增加正在运行,而不是完成时。 – Tranoze