2013-05-07 72 views
1

我有一個在線程池中執行的委託。計數作爲變量正確傳遞,但是,當程序返回輸出時,傳入的初始值現在是更新後的版本。我如何修改這些變量以保持正確的值?線程安全,防止變量更新

private void SetControlText(TextBox TB, string txt) 
    { 
     if (TB.InvokeRequired) 
     { 
      Invoke((MethodInvoker)delegate 
      { 
       TB.AppendText(txt + "\n"); 
       TB.Update(); 
      }); 
      return; 
     } 

     TB.Text = txt; 
    } 

    private void DoWork(OCAdapter.OCAdapter Adapter, OutputForm output, int c, object ThreadContext = null) 
    { 
     int count = c; 
     //output.AppendToOutput("Initializing Adapter: " + count + " Test\n"); 
     SetControlText(output.OutputBx, "Initializing Adapter: " + count + " Test\n"); 
     try 
     { 
      var Test = Adapter.GetBookmarks(); 
      if (Test != null) 
       //output.AppendToOutput("Adapter: " + count + " is valid\n"); 
       SetControlText(output.OutputBx, "Adapter: " + count + " is valid\n"); 
     } 
     catch (Exception ex) 
     { 
      //output.AppendToOutput("Exception occured on adapter: " + count + " Exception: " + ex.Message); 
      SetControlText(output.OutputBx, "Exception occured on adapter: " + count + " Exception: " + ex.Message); 
     } 
    } 
+0

你怎麼稱呼DoWork? – JeffRSon 2013-05-07 20:45:09

+0

我不確定要理解,也許需要更多一點的代碼?如果你希望'DoWork'在另一個線程傳遞給''SetControlText'時不被另一個線程中斷,那麼你應該用'lock'聲明來包圍你的方法體:http://msdn.microsoft.com/en- us/library/c5kehkcz(v = vs.71).aspx雖然我不確定這是你的問題。 – 2013-05-07 21:12:07

回答

1

嘿,我居然找到了答案,該線程使用共享內存使他們在訪問變量它增加了。

我解決這個問題的方法是通過傳遞一個臨時變量與計數。

0

您的SetControlText()不太正確。它正在執行一個Invoke(),並且還從正好在其下面的錯誤線程設置Text。每次。

嘗試這樣的事情,而不是,看看問題是否會消失:

private delegate void SetControlTextDelegate(TextBox TB, string txt); 
    private void SetControlText(TextBox TB, string txt) 
    { 
     if (TB.InvokeRequired) 
     { 
      TB.Invoke(new SetControlTextDelegate(SetControlText), new object[] { TB, txt }); 
     } 
     else 
     { 
      TB.AppendText(txt + Environment.NewLine); 
     } 
    } 
+0

你確定嗎?在我看來,他的實施和你的工作一樣。他只是使用匿名委託而不是命名委託。如果它在主線程上,則在主線程上調用委託,並返回「SetControlText」。你的實現有什麼不同? – 2013-05-09 17:53:38

+0

你是對的西蒙,我錯過了第一個街區盡頭的'回報'。 – 2013-05-09 17:58:20