【问题标题】:Cross-Thread operation not valid in Windows Application [duplicate]跨线程操作在 Windows 应用程序中无效 [重复]
【发布时间】:2012-02-09 23:56:43
【问题描述】:

可能重复:
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;
    }

【问题讨论】:

  • WPF 还是 WInFOrms?有很多相同的问题都有很好的答案
  • 为什么要在单独的线程上完成?

标签: c# thread-safety


【解决方案1】:

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

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

【讨论】:

  • 我收到错误提示当前没有定义
  • 您使用的是 System.Windows.Application 而不是 System.Windows.Forms.Application 对吗?如果您不在 WPF 应用程序中,那么 Brad 的答案更合适。
  • 这里必须有什么东西,因为 System.Windows.Application 绝对有一个静态的 Current 成员:msdn.microsoft.com/en-us/library/…
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这样做的原因是除非您在表单的线程上,否则您无法对表单执行任何操作。然后这将使用标准的表单调度线程。为了从另一个线程更新表单,您必须使用 Form.Invoke 方法。

    【讨论】:

    • 或 BeginInvoke - 如果您不希望调用线程等待表单更新(将其发布到 UI 线程)
    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 2011-03-27
    相关资源
    最近更新 更多