AvalonEdit Изменить тему владельца

Я использую AvalonEdit уже более 2 лет без проблем, и он отлично работает
Я просто столкнулся с одной проблемой при изменении текста из фонового потока
с использованием SetOwnerThread() триггера метода VerifyAccess() Exception каждый раз, даже при вызове из основного потока< br> Если я делаю все в основном потоке, все работает, но это также останавливает пользовательский интерфейс
Вот почему я хочу сделать это в другом потоке и показать пользователю индикатор загрузки
Кажется, я не могу понять, что я делаю неправильно здесь
Любая помощь или идея будут очень признательны
Спасибо заранее

Изменить:
я не хочу использовать Dispatcher.Invoke, потому что он будет блокировать пользовательский интерфейс при обновлении.

Образец кода

public async void EditTextSample()
{
    Thread lUiThread = Thread.CurrentThread;

    //SelectedTab is the current tab viewed by the user in my application
    SelectedTab.TextEditor.Document.SetOwnerThread(null);

    await Task.Run(() => 
    {
        Thread lBackgroundThread = Thread.CurrentThread;

        SelectedTab.TextEditor.Document.SetOwnerThread(lBackgroundThread);

        string lNewText = ""
        SelectedTab.TextEditor.Document.Text = lNewText;

        SelectedTab.TextEditor.Document.SetOwnerThread(lUiThread);
    });
}

Несколько скриншотов
https://imgur.com/VKsGXvk


person fredodiable    schedule 20.01.2020    source источник
comment
Вы должны использовать Dispatcher.Invoke для обновления элементов управления из другого потока, как описано здесь Изменить элементы управления WPF из неосновного потока с помощью Dispatcher.Invoke Кроме того, не публикуйте код/ошибки в виде изображений   -  person Pavel Anikhouski    schedule 20.01.2020
comment
Да, я знаю, когда использовать Dispatcher.Invoke, но здесь я не хочу, потому что это заморозит основной пользовательский интерфейс при обновлении. Недостаточно репутации для размещения изображения. Я пытаюсь использовать метод SetOwnerThread, чтобы позволить мне обновить этот элемент управления из фонового потока.   -  person fredodiable    schedule 20.01.2020
comment
Поток пользовательского интерфейса должен владеть документом, пока он отображается в редакторе. Попробуйте создать новый документ в фоновом потоке, а затем обновить редактор, установив textEditor.Document после загрузки нового документа.   -  person Daniel    schedule 24.02.2020


Ответы (1)


Я вернулся,
так как Даниэль предложил создать новый TextDocument в фоновом потоке, это помогло
Примечание: это сбросит стек отмены
Вот пример решения :)

public async void EditTextSample()
{
    Thread lUiThread = Thread.CurrentThread;

    //SelectedTab is the current tab viewed by the user in my application
    ITextSource lDocumentSnapshot = SelectedTab.TextEditor.Document.CreateSnapshot();
    TextDocument lNewDocument = null;

    await Task.Run(() => 
    {
        lNewDocument = new TextDocument();

        string lCurrentText = lDocumentSnapshot.Text;
        string lNewText = "";

        lNewDocument.Text = lNewText;

        lNewDocument.SetOwnerThread(lUiThread);
    });

    SelectedTab.TextEditor.Document = lNewDocument;
}
person fredodiable    schedule 15.08.2020