2013-08-26 44 views
0

創建線程的線程上我找不到這個答案訪問:跨線程操作無效:控制「progressBar1」從比它是在

「跨線程操作無效:控制'progressBar1'從其創建線程以外的線程訪問 。「

這是我的代碼:

 private void buttonStart_Click(object sender, EventArgs e) 
     { 
      ClassCopy cb = new ClassCopy(); 
      cb.startCopy(textBoxSrc.Text, textBoxDest.Text, true); 

      th = new Thread(loading); 
      th.Start(); 

     } 

     private loading() 
     { 
      for (int i = 0; i < 100; i++) 
      { 
       if (progressBar1.InvokeRequired) 
        progressBar1.Invoke(new Action(loading)); 
       else 
        progressBar1.Value = i; 
      } 
     } 
+4

這個錯誤確實很好。無論如何,請考慮一個BackgroundWorker。 – LarsTech

+0

但我不明白如何使用我的情況下,我可以修復它的方式。 – Ers313

+0

問題是,您正在使用委託調用「修改」GUI線程,而不是輕輕地要求修改。 – Max

回答

1

它真的只是做

private delegate void EventHandle(); 

private void loading() 
{ 
    for (int i = 0; i < 100; i++) 
    { 
     Thread.Sleep(10); 
     Invoke(new EventHandle{progressBar1.Value++;}) 
    } 
} 

睡眠是這樣,你會看到的變化,否則它會去從0到100在毫秒內

0

這個簡單的改變會做:

 private void loading() 
     { 
      for (int i = 0; i < 100; i++) 
      { 
       if (progressBar1.InvokeRequired) 
        progressBar1.Invoke(new Action(loading)); 
       else 
        progressBar1.Value = i; 
      } 
     } 
+0

它的工作,但只有當複製完成,而不是在它期間 – Ers313

+0

ahhhh通過您的編輯我現在認爲你正在嘗試的是看到複製操作的更新,因爲最好的方法是背景工作....嘗試這開始 - http://msdn.microsoft.com/en-us/library/vstudio/ywkkz4s1(v=vs.100).aspx ...也檢查此更多的見解 - http://www.dotnetperls。 com/backgroundworker – terrybozzio

+0

這也是關於backgroundworker更詳細 - http://www.dreamincode.net/forums/topic/112547-using-the-backgroundworker-in-c%23/ – terrybozzio

相關問題