2012-01-13 27 views
0

可能重複:
Cross-thread operation not valid跨線程操作Windows應用程序無效

餘米嘗試運行這2個線程控制撤消和重做按鈕啓用或不,但即時通過螺紋無效,我試圖創建一個調用,但我不能使用按鈕

這裏是我的代碼

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或WinForms的?有很多相同的問題有很好的答案 – sll 2012-01-13 19:48:59

+1

WinForms? WPF?什麼? – 2012-01-13 19:49:19

+1

爲什麼這是在一個單獨的線程上完成的? – Joe 2012-01-13 19:52:00

回答

3

原因是你不能對錶單做任何事情,除非你在表單的主題上。這將使用標準的Form調度線程。爲了從另一個線程更新表單,您必須使用Form.Invoke方法。

+1

或BeginInvoke - 如果您不希望調用線程等待表單更新(將其發佈到UI線程上) – Jeb 2012-01-13 19:52:31

0

您無法從UI線程以外的線程更新UI。您需要重新將操作委託給您。嘗試使用控件上提供的Invoke()方法,甚至是表單本身。

0

如果您對WPF,你必須調用到UI線程與應用程序的分派對象:

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

我收到錯誤說當前沒有定義 – jprbest 2012-01-13 20:16:41

+0

您正在使用System.Windows.Application,而不是系統.Windows.Forms.Application權利?如果你不在WPF應用程序中,那麼Brad的答案更適合。 – 2012-01-13 20:20:03

+0

是的,對不起, – jprbest 2012-01-13 20:21:30