2010-07-19 49 views
1

我有一個Windows窗體對話框,在一個較長的操作是BackgroundWorker的作業中運行(asynchron)。在此操作過程中,我想更改表單上的一些值(標籤,...)。但是當背景工作者試圖改變窗體上的東西時,我得到錯誤「跨線程操作無效」!這個問題怎麼解決?如何解決「跨線程操作無效」問題?

+1

這是這裏解釋:http://msdn.microsoft.com/en-我們/庫/ ms993020 – 2010-07-19 13:05:54

+0

更好地從這裏開始:http://msdn.microsoft.com/en-us/library/ms951089 在系列的開始! – 2010-07-19 16:10:26

回答

3

呼叫從工人的ReportProgress方法,並處理ProgressChanged來更新當前狀態。

2

檢查是否需要調用,然後調用BeginInvoke。

private void AdjustControls() 
     { 
      if (this.InvokeRequired) 
      { 
       this.Invoke(new MethodInvoker(this.AdjustControls)); 
      } 
      else 
      { 
       label1.Text = "Whatever"; 
      } 
     } 
+0

我試過了。但它不起作用。可以給我更多的細節。提前致謝! – uhu 2010-07-19 14:47:05

+0

對不起,我修好了一下。如果AdjustControls接受參數,例如,如果它是一個事件處理程序,那麼您不能使用MethodInvoker,您必須爲它定義一個委託。 – Kurt 2010-07-19 15:27:31

1

我覺得有些不可思議這裏tooting我自己的號角,但你會發現從ThreadSafeControls庫我寫了整整爲此一些使用。

1

您不能直接在不創建它們的線程內部更改控件。您可以使用如上所示的invoke方法,也可以使用BackgroundWorker ProgressChanged事件。 BackgroundWorker的DoWork的內部使用

代碼:BackgroundWorker的ProgressChanged內使用

myBackgroundWorker.ReportProgress(50); // Report that the background worker has got to 50% of completing its operations. 

代碼:

progressBar1.Value = e.ProgressPercentage; // Change a progressbar on the WinForm