스레드 풀에서 실행되는 대리자가 있습니다. 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);
}
}
DoWork를 어떻게 부르십니까? – JeffRSon
잘 모르겠다. 조금 더 많은 코드가 필요할지도 모르겠다. 'DoWork'가'Count'를'SetControlText'에 전달하는 동안 다른 스레드에 의해 인터럽트되지 않게하려면 메서드 본문을'lock' 문으로 둘러싸 야합니다 : http://msdn.microsoft.com/en- us/library/c5kehkcz (v = vs.71) .aspx이게 당신의 문제인지는 잘 모르겠습니다. –