2012-01-13 2 views
0

:
Cross-thread operation not valid크로스 스레드 작업 유효하지 가능한 중복

내가 실행 취소를 제어하고 버튼을 다시이 2 스레드를 실행하는 데 노력하고있어 사용하거나 사용하지합니다 ,하지만 메신저 크로스 스레드를 받고 유효하지 않은, 나는 invoke를 만들려고했는데 버튼을 사용할 수 없었다.

여기 내 코드는

이다.
private Thread _undoThread; 
    private Thread _redoThread; 

    _undoThread = new Thread(UndoEnabledCheck); 
    _undoThread.Start(); 
    _redoThread = new Thread(RedoEnabledCheck); 
    _redoThread.Start(); 

    private void UndoEnabledCheck() 
    { 
     UndoButton.Enabled = _undoBuffer.CanUndo; 
    } 

    private void RedoEnabledCheck() 
    { 
     RedoButton.Enabled = _undoBuffer.CanRedo; 
    } 
+1

WPF 또는 윈폼을? 좋은 답변이있는 동일한 질문이 많이 있습니다. – sll

+1

WinForms? WPF? 뭐? –

+1

왜이 작업은 별도의 스레드에서 수행됩니까? – Joe

답변

3

이유는 양식의 스레드에 있지 않는 한 양식에 아무 것도 할 수 없다는 것입니다. 그러면 표준 양식 발송 스레드가 사용됩니다. 다른 스레드에서 양식을 업데이트하려면 Form.Invoke 메서드를 사용해야합니다.

+1

또는 BeginInvoke - 양식이 업데이트 될 때까지 기다리는 호출 스레드를 원하지 않는 경우 (UI 스레드에 게시) – Jeb

0

UI 스레드가 아닌 스레드에서 UI를 업데이트 할 수 없습니다. 작업을 다시 위임해야합니다. 컨트롤이나 폼 자체에 제공된 Invoke() 메서드를 사용해보십시오. 당신은 WPF에있는 경우

0

, 당신은 응용 프로그램의 디스패처 객체와 UI 스레드로 호출 할 수 있습니다

Application.Current.Dispatcher.BeginInvoke(() => 
{ 
    UndoButton.Enabled = _undoBuffer.CanUndo; 
}); 
+0

현재 정의에 대한 정의가 없다는 오류가 나타납니다. – jprbest

+0

System.Windows.Application을 사용하고 System이 아닙니다. .Windows.Forms.Application right? WPF 앱이 아니라면 Brad의 대답이 더 적합합니다. –

+0

예. 그것에 대해 죄송합니다 – jprbest

관련 문제