2012-01-13 78 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