交叉线程操纵WPF控制错误:不能

时间:2012-02-02 22:12:20

标签: c# wpf multithreading invoke dispatcher

我在尝试操作WPF中的 FlowDocumentScrollViewer 控件时遇到了一个问题。我通过互联网搜索了这种错误,但发现我的问题非常独特。

这是代码:

    delegate void delg_FlowDoc(FlowDocument fdoc);

    //Function provided for both internal calling and outside calling 
    public void setfDocDisplay(FlowDocument fdoc)
    {

        FlowDocumentScrollViewer display = this.fDocDisplay;  //control to be operated

        if (display.Dispatcher.CheckAccess())
        {
            //called from own thread, just operate directly!

            string debug_check_ThreadName = Thread.CurrentThread.Name;
            if (debug_check_ThreadName == "Thread_MainUI")
            {

                //Debug only, now current thread MUST be the thread
                //created the UI!!!!
                display.Document = fdoc;  //<-- Error this line
            }
        }
        else
        {
            //called from other threads, use Invoke()!
            delg_FlowDoc pFun = new delg_FlowDoc(setfDocDisplay);
            this.Dispatcher.Invoke(pFun, new object[] { fdoc });

            //display.Dispatcher.Invoke(pFun, new object[] { fdoc });
            //this.Dispatcher.BeginInvoke(pFun, new object[] { fdoc });
        }
    }

display.Document = fdoc;发生错误,说仍然无法从其他线程访问该控件。

这是错误的详细快照: Error!

我很困惑,因为:

  1. 我已经执行display.Dispatcher.CheckAccess()以确保当前线程有权在控件显示屏上操作。

  2. 我再次添加一个debug_check_ThreadName以确保它在当前正确的线程中。

  3. 我在另一个没有错误的WPF项目中尝试了完全相同的代码

  4. 但仍然遇到同样的问题,告诉我我尝试从不同的线程进行操作。

    我不熟悉调度程序调用等属性的其他属性,因此我现在不知道要解决此问题。

    如果有人能给我任何关于这个错误的提示吗?

    谢谢!

    [解决]

    谢谢 500 - 内部服务器错误

    由于我仍然对这个事实感到震惊,所以我决定在问题中加入我的理解,以便其他人有同样的问题并看到这个问题。

    我现在已经解决了这个问题。这是因为 FlowDocument fdoc 实际上是一种UI控件,并在另一个线程中创建。因此,当主窗口线程想要操作该fdoc时 - 虽然它具有 FlowDocumentScrollViewer显示的权限 - 但它没有对此分配句中的其他控件 fdoc 的权限。

    这很奇怪!!我认为fdoc只是一个普通的变量,如字符串或int vars ...&gt;&lt;

1 个答案:

答案 0 :(得分:4)

这不是您(尝试)分配给那个问题的控件 - 它是未在UI线程上创建的源文档。