Обновление пользовательского интерфейса из фоновой темы - PullRequest
0 голосов
/ 31 октября 2011

Это просто любопытный вопрос. Какой из них является лучшим способом обновления пользовательского интерфейса из другого потока. Во-первых, этот:

private delegate void MyDelegateMethod();
void MyMethod()
{
    if (unknowncontrol.InvokeRequired)
    {
        this.BeginInvoke(new MyDelegateMethod(MyMethod));
        return;
    }
    unknowncontrol.property = "updating!";
}

С другой стороны:

Invoke((System.Threading.ThreadStart)delegate()
{
    unknowncontrol.property = "updating!";
});

Или есть лучший способ сделать это?

Конечно, это для WinForms, для WPF есть диспетчер. Как код для WPF?

Я спрашиваю, потому что в прошлом у меня возникали ошибки при обновлении пользовательского интерфейса из вызванного события с использованием обеих опций выше. Тип ошибки, такой как: «нет доступного исходного кода». Я предполагаю, что все мы видели их: D.

Спасибо, и хорошего дня!

Ответы [ 6 ]

1 голос
/ 01 ноября 2011

Ознакомьтесь с постом Роя Ошерова в блоге по этому вопросу: http://osherove.com/blog/2006/3/1/the-3-ways-to-create-a-thread-safe-gui-with-net-20-with-one.html

delegate void Func<T>(T t);
Func del = delegate
{

  // UI Code goes here
};
Invoke(del);
0 голосов
/ 01 января 2016

Используйте [Dispatcher.Invoke (DispatcherPriority, Delegate)]] , чтобы изменить пользовательский интерфейс из другого потока или из фона.

Шаг 1 .Используйте следующие пространства имен

using System.Windows;
using System.Threading;
using System.Windows.Threading;

Шаг 2 .Поместите следующую строку, где вам нужно обновить пользовательский интерфейс

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate
{
    //Update UI here
}));

Синтаксис

[BrowsableAttribute(false)]
public object Invoke(
  DispatcherPriority priority,
  Delegate method
)

Параметры

priority

Тип: System.Windows.Threading.DispatcherPriority

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

method

Тип: System.Delegate

Делегат метода, который не принимает аргументов, который помещается в очередь событий Dispatcher.

Возвращаемое значение

Тип: System.Object

Возвращаемое значение из вызываемого делегата или значение NULL, если у делегата нет возвращаемого значения.

Информация о версии

Доступно с .NET Framework 3.0

0 голосов
/ 17 февраля 2015

Делегат действия по умолчанию работал 90% времени:

private void Log(String value)
{
    // Verify that we're on the same thread
    if (textBox1.InvokeRequired)
    {
        // We're not on the same thread - Invoke the UI thread
        textBox1.Invoke(new Action<string>(Log), value);
        return;
    }

    // We're on the same thread - Update UI
    textBox1.Text += value + "\r\n";
}

private void OnSomethingHappened()
{
    Log("Something happened!");
}
0 голосов
/ 01 ноября 2011

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

0 голосов
/ 01 ноября 2011

На мой взгляд, лучший способ - установить CLR-свойство, к которому привязано свойство ui-элемента.

0 голосов
/ 31 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...