2010-06-30 58 views
2

我有一個問題,每當我刷新程序欄我得到的錯誤調用線程不能訪問此對象,因爲不同的線程擁有它 我該如何刪除它 沙善調用線程不能訪問此對象,因爲不同的線程擁有它

 backgroundWorker12 = new BackgroundWorker(); 
    timer1.Enabled = true; 
     //cancel any async processes running for the background worker 
    //backgroundWorker1.CancelAsync(); 
    backgroundWorker12.DoWork += (s, args) => 
    { 

     BackgroundWorker worker2 = s as BackgroundWorker; 
     worker2.WorkerReportsProgress = true; 

     float percentageDone = 20f; 
     //check if the user status and update the password in xml 
     CheckUseridPwd(); 


     //call the function to sync the wall chart data 

     //call the function to sync event relate data 

     percentageDone = 100f; 
     ValidateLogin2(txtUserID.Text.Trim(), txtPassword.Password.Trim(), -1); 
     worker2.ReportProgress((int)percentageDone); 

    };` 

回答

5

這一點看起來像它的使用從錯誤的線程UI控件:

ValidateLogin2(txtUserID.Text.Trim(), txtPassword.Password.Trim(), -1); 

我建議你捕捉它增加了事件公頃以上代碼局部字符串變量的用戶名和密碼ndler - 您可以在代理中使用這些捕獲的變量。一切都這樣,應該是正確的線程上:

backgroundWorker12 = new BackgroundWorker(); 
timer1.Enabled = true; 

string user = txtUserID.Text.Trim(); 
string password = txtPassword.Password.Trim(); 
backgroundWorker12.DoWork += (s, args) => 
{ 
    // ... same code as before up to here 
    ValidateLogin2(user, password, -1); 
    worker2.ReportProgress((int)percentageDone); 
}; 
+0

工作很大,但是當我們在代碼的組合框結合上文中的數據,它會給同樣的錯誤 – Shashank 2010-06-30 08:59:19

+0

@SHASHANK:我我害怕我不知道你的意思。綁定哪些數據?如上面哪個代碼 - 我的還是你的?你試圖在哪個線程中執行綁定? – 2010-06-30 09:16:11

+0

對不起,我寫錯了 謝謝 – Shashank 2010-06-30 12:52:20

0

看看你能不能用RunWorkerCompleted event of the BackgroundWorker,,因爲你所訪問的UI進度100%,即做了之後.. 那麼你就不必擔心關於WPF UI控件的線程親和性 - 因爲在右側/ UI線程上再次調用事件處理程序。

其他選項(如果您需要在工作完成之前訪問UI控件)將在工作啓動之前將Dispatcher.CurrentDispatcher在UI線程上返回的對象 緩存,然後使用object.Invoke將其編組爲來自正在執行DoWork處理程序的線程池線程的正確線程。見some code here

0

你試過調用ValidateLogin2

你可以做到直接從你的代碼所示,或者ValidateLogin2檢查,如果該方法本身需要調用。如果沒有,繼續和驗證,但如果這樣做,那麼有它調用它本身

void ValidateLogin2(...) 
{ 
    if (this.InvokeRequired)  
    {   
    //Invokes itself if required   
    BeginInvoke(new MethodInvoker(delegate(){ValidateLogin2(...);})); 
    } 
    else 
    { 
    //validate login here  
    } 
} 
相關問題