2013-05-07 4 views
1

스레드 풀에서 실행되는 대리자가 있습니다. count가 변수로 올바르게 전달되지만, 프로그램이 출력을 반환 할 때 전달 된 초기 값은 이제 업데이트 된 버전이됩니다. 변수가 올바른 값을 유지하도록 수정하려면 어떻게해야합니까?스레드 안전, 변수 업데이트 금지

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

+0

잘 모르겠다. 조금 더 많은 코드가 필요할지도 모르겠다. 'DoWork'가'Count'를'SetControlText'에 전달하는 동안 다른 스레드에 의해 인터럽트되지 않게하려면 메서드 본문을'lock' 문으로 둘러싸 야합니다 : http://msdn.microsoft.com/en- us/library/c5kehkcz (v = vs.71) .aspx이게 당신의 문제인지는 잘 모르겠습니다. –

답변

1

이봐, 난 실제로이 증가 된 후에 그들이 변수에 접근했다, 그래서 스레드가 공유 메모리를 사용하고, 답을 발견했다.

내가 수정 한 방법은 개수가있는 임시 변수를 전달하는 것입니다.

0

SetControlText()가 올바르지 않습니다. 그것은 둘 다 Invoke()를하고 또한 텍스트를 어쨌든 잘못된 스레드에서 그 바로 아래에 설정합니다. 때마다. 대신 볼 같은

시도 뭔가 문제가 사라질 경우 :

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'가 반환됩니다. 구현과의 차이점은 무엇입니까? –

+0

당신 말이 맞아요. 사이먼. 나는 첫 번째 블록의 끝에서'return; '을 놓쳤다. –