Проблема с доступом к пользовательскому интерфейсу из фонового рабочего

Я перевожу проект с winforms на WPF. Когда мой код был основан на WinForms, я использовал (this.InvokeRequired), чтобы проверить, есть ли у потока доступ. Теперь я использую следующий код, основанный на моей основной форме:

    // this is the delegate declaration to Allow Background worker thread to write to Log Output
    delegate void LogUpdateCallBack(String LogMessage);

    // method to update the Log Window from the Background Thread
    public void LogUpdate(String LogMessage)
    {
        Console.WriteLine("Entering");
        if (!Application.Current.Dispatcher.CheckAccess())
        {
            Console.WriteLine("Thread doesn't have UI access");
            LogUpdateCallBack callback = new LogUpdateCallBack(LogUpdate);
            Application.Current.Dispatcher.Invoke(callback, LogMessage);
        }
        else
        {
            Console.WriteLine("Thread has UI access");
            listBox_Output.Items.Add(LogMessage);
            Console.WriteLine(LogMessage);
            // listBox_Output.TopIndex = listBox_Output.Items.Count - 1;
        }
        Console.WriteLine("Exiting");
    }

У меня проблема в том, что список не обновляется. Ошибок и исключений нет, пробовал обновить другие элементы управления UI. LogMessage записывает в окно вывода, поэтому я в тупике.

Вот пример вывода консоли:

Entering
Thread doesn't have UI access
Entering
Thread has UI access
My LogMessage is output here 
Exiting
Exiting
Entering
Thread doesn't have UI access
Entering
Thread has UI access
My LogMessage is output here 
Exiting
Exiting

Я попытался обновить другие элементы управления пользовательского интерфейса, чтобы проверить, не проблема ли это с моим Listbox, но безуспешно.

Кроме переключения на CheckAccess (), единственное другое важное изменение Я сделал в новом коде WPF основу всего кода, работающего в фоновом работнике, в другом классе. Я не уверен, может ли это быть частью проблемы?.

-

@JonRaynor

Я попробовал вашу идею:

Application.Current.Dispatcher.BeginInvoke(new LogUpdateCallBack(LogUpdate), LogMessage)

Однако мой список все еще не обновляется, если я выведу

Console.WriteLine(listBox_Output);

, я вижу, что массив списка растет:

System.Windows.Controls.ListBox Items.Count:2020
System.Windows.Controls.ListBox Items.Count:2021
System.Windows.Controls.ListBox Items.Count:2022
System.Windows.Controls.ListBox Items.Count:2023
System.Windows.Controls.ListBox Items.Count:2024
System.Windows.Controls.ListBox Items.Count:2025

Но никаких изменений в форме. Это очень сбивает с толку!.

6
задан Community 23 May 2017 в 11:55
поделиться