2013-05-07 126 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