Какой подход к потоковой обработке WPF мне нужен? - PullRequest
2 голосов
/ 28 сентября 2011

Я пишу приложение WPF (новая техника, в основном я пишу в WinForms).Моя цель - сделать пользовательский интерфейс отзывчивым все время, и я прочитал, что этого можно добиться с помощью Threading / BackgroundWorker.Я думаю, что я должен использовать фоновый рабочий, чтобы использовать там трудоемкие методы.Но я планирую использовать метод * m_AddLog (string logText) *, который должен добавлять текст в текстовое поле.Этот метод я хочу вызвать как из основного потока пользовательского интерфейса, так и из фонового рабочего, поэтому сообщения будут отправляться немедленно при обработке в фоновом режиме, а не в ожидании завершения фоновой задачи.Не могли бы вы, пожалуйста, посоветовать, как правильно написать, написать эти методы, чтобы пользовательский интерфейс был полностью отзывчивым, так как я мало что знаю о делегатах, вызовах, фоновых рабочих и т. Д.?

Ответы [ 3 ]

7 голосов
/ 28 сентября 2011

Если вы хотите запустить какой-либо фоновый процесс, то обновите пользовательский интерфейс после завершения, следующий шаблон работает хорошо (если он запускается из потока пользовательского интерфейса).

Task.Factory.StartNew(() =>
            {
                // Background work
            }).ContinueWith((t) => {
                // Update UI thread

            }, TaskScheduler.FromCurrentSynchronizationContext());

Поместите фоновую работу в первую задачу, иUI работать в следующем его является задачей.Опция TaskScheduler обеспечивает выполнение второй задачи в потоке пользовательского интерфейса.

2 голосов
/ 28 сентября 2011

Как сказали люди, есть множество вопросов, которые покажут вам, как это сделать. Но если вы хотите сравнить это, вы можете найти его здесь с подробным сравнением

2 голосов
/ 28 сентября 2011

Большинство элементов в приложении wpf, использующих задачу и диспетчер, дадут лучшие результаты.

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

ObservableCollection items= new ObservableCollection();
TaskFactory tFactory = new TaskFactory();
tFactory.StartNew(() =>
{
for (int i = 0; i < 50; i++)
{
//Request to server
System.Windows.Application.Current.Dispatcher.BeginInvoke((Action)delegate()
{
// UPDATE PROGRESS BAR IN UI
});

items.Add(("");
}

}).ContinueWith(t =>
{
if (t.IsFaulted)
{
// EXCEPTION IF THREAD IS FAULT
throw t.Exception;
}
System.Windows.Application.Current.Dispatcher.BeginInvoke((Action)delegate()
{
//PROCESS DATA AND DISPLAY
});
});
...