Ошибка управления потоком в многопоточном режиме: невозможно - PullRequest
1 голос
/ 03 февраля 2012

Я столкнулся с проблемой при попытке манипулировать элементом управления FlowDocumentScrollViewer в WPF.Я искал в интернете эту ошибку, но обнаружил, что моя проблема совершенно уникальна.

это код:

    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, в котором нет ошибок

Но все же возникла та же проблема:попробуйте работать из другого потока.

Я не знаком с другими свойствами Dispatcher или Invoke и т. Д., Поэтому я понятия не имею, как решить эту проблему.

Если кто-нибудь может подсказать мне эту ошибку?

Спасибо!

[решено]

Спасибо 500 - Внутренняя ошибка сервера !

Поскольку я все еще в шоке от этого факта, я решил выразить свое понимание этого вопроса, чтобы облегчить кому-то еще такую ​​же проблему и увидел этот вопрос.

Я исправил проблему.Это потому, что FlowDocument fdoc на самом деле является типом элемента управления пользовательского интерфейса и создается в другом потоке.Поэтому, когда поток главного окна хочет управлять этим fdoc - хотя он имеет разрешение на отображение FlowDocumentScrollViewer - он не имеет разрешения на другой элемент управления fdoc в этом предложении назначения.

Это довольно странно !!Я думал, что fdoc - это обычная переменная, такая как строка или int vars ...> <</p>

1 Ответ

4 голосов
/ 03 февраля 2012

Проблема заключается не в элементе управления, который вы (пытаетесь) назначить, а в исходном документе, не созданном в потоке пользовательского интерфейса.

...