跨线程操作在Windows应用程序中无效

时间:2012-01-13 19:47:17

标签: c# thread-safety

  

可能重复:
  Cross-thread operation not valid

我试图运行这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;
    }

3 个答案:

答案 0 :(得分:3)

这样做的原因是除非您在表格的主题上,否则您不能对表格做任何事情。然后,这将使用标准的Form调度线程。要从另一个线程更新表单,您必须使用Form.Invoke方法。

答案 1 :(得分:0)

您无法从UI线程以外的线程更新UI。您需要重新委派操作。尝试使用控件上提供的Invoke()方法,甚至是表单本身。

答案 2 :(得分:0)

如果您使用的是WPF,则必须使用Application的Dispatcher对象调用UI线程:

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