2011-11-02 64 views
0

我正在申请一个进度条和一个按钮。如何在C sharp windows应用程序中处理交叉线程错误?

当按钮点击进度条价值将得到提高,这是源代码,

private void Run() 
     {    
       progressBar1.Maximum = 1000; 
       progressBar1.Minimum = 0; 
       progressBar1.Step = 1; 

       for (int l_nIndex = 0; l_nIndex < 1000; l_nIndex++) 
       { 
         progressBar1.Value++; 
         Thread.Sleep(10); 
       } 
      } 


private void button1_Click(object sender, EventArgs e) 
     { 
       Run(); 
    } 

因此,当我运行应用程序,进度条价值是越来越增加了,但是当我尝试移动窗户没有响应。

我不能以正常的线程方式运行它 - 它会抛出跨线程错误。

,所以我改变了这样的代码,

private void Run() 
     { 
       if (this.InvokeRequired) 
       { 
        this.Invoke(new MethodInvoker(this.Run)); 
       } 
       else 
       { 
        progressBar1.Maximum = 1000; 
        progressBar1.Minimum = 0; 
        progressBar1.Step = 1; 
        for (int l_nIndex = 0; l_nIndex < 1000; l_nIndex++) 
        { 
          progressBar1.Value++; 
          Thread.Sleep(10); 
        } 
       } 
     } 

private void button1_Click(object sender, EventArgs e) 
     { 
       Thread myThread = new Thread(new ThreadStart(Run)); 
       myThread.Start(); 
     } 

现在我可以能够移动winodow,但是当我移动停止进度条,当我松开鼠标按钮的断点续传。所以仍然在UI线程中执行。 如何更好地处理它。请帮助我做到这一点。

+0

见我的答案在这里: 【答案为 “跨线程操作失败”] [1] [1]:http://stackoverflow.com/questions/1489374/cross-thread-operation-not-valid-does-not-kill-winforms-application-and-it-sh/1489452#1489452 – Spence

+1

这里的一切都是错误的,我不能d关于它的任何事情。一切。为什么不只是使用Timer控件? –

回答

3

Invoke()通过从UI线程运行给定的委托来工作。因此,如果您使用Invoke()来运行您的整个方法,那么您的整个方法从UI线程运行。

相反,你应该做你的实际工作其他线程,只是进行UI更新在UI线程中,仅通过Invoke()荷兰国际集团执行更新的代码的小位。

一个简单的方法是使用标准库中内置的BackgroundWorker类。

3

这已经回答了here - 在你的情况下,代码应该是这个样子:

this.BeginInvoke((Action)(() => progressBar1.Value++));