2015-06-20 115 views
-3

好吧,很简单,创建一个窗口窗体,放入一个按钮和一个标签,并给这个按钮一个点击事件。标签中的循环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秒,当我点击按钮。我怎样才能解决这个问题?

+0

发生这种情况是因为你在UI线程上做了一个很长的任务。看看'BackgroundWorker','async'和'StringBuilder'作为奖励。 – SimpleVar

+0

现在你的问题是“如果你运行需要花费一些时间和重复多次的代码,需要很长时间,如何修复它?”你可能想澄清你实际上想要达到什么... –

+0

我没有看到我放入按钮是一个长期的任务,它只是一个300x300的运行,但我想在这个程序中看到的是,y在程序中立即增加正在运行,而不是完成时。 – Tranoze

回答

1

你必须从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(); })); 
     } 
} 
+1

中发现了一个类似的问题,这个变化所做的唯一的事情是,由于线程之间不断的回调,使得它变得更慢......不知道这将是多么有帮助。 .. –

+0

@AlexeiLevenkov - 速度较慢,真实。线程编组并不便宜。这取决于目标是什么。我认为OP正试图在处理时处理无响应的UI。 – sarme

+0

工作线程上的小睡会给UI线程渲染机会......显然不是最好的解决方案(应该使用计时器),但是没问题。 –