Arhn - архитектура программирования

Обновить связанный элемент управления из собственного фонового потока

У меня есть WPF с приложением MVVM. ViewModel и View связаны. Элементы управления из View привязаны к ViewModel, а ViewModel наследует INotifyChanged. Простое обновление элемента управления в ViewModel работает нормально.

Я хотел бы создать некоторый информационный класс, содержащий некоторые информационные поля. Затем я хочу создать свой собственный поток, который сопоставляет поля из класса Info с полями в ViewModel, которые обновляют представление. Объект класса Info будет использоваться в качестве аргумента функции, вызываемой в ViewModel.

private int someControl;
public SomeControl {
    get{return someControl;}
    set 
    {
        someControl = value;
        OnPropChanged("SomeControl");
    }

private InfoClass info = new InfoClass();
Thread thread = null;

public ViewModel()
{
    Thread thread = new Thread(new ThreadStart(update));
    thread.IsBackground = true;
    thread.start();

    someLongFunction(info);
}

private void update()
{
    SomeControl = info.someField;
    thread.sleep(1000);
    update();
}

Что я должен добавить или изменить, чтобы периодически получать обновления? Теперь обновление происходит только тогда, когда someLongFunction завершает свою работу.

06.03.2013

  • Я не совсем тебя понимаю... Что ты хочешь сделать? Хотите периодически обновлять свой вид? 06.03.2013
  • Действительно, я хочу эту функциональность :) 06.03.2013
  • Рекурсивный вызов вашего метода обновления, как вы это делаете, в конечном итоге создаст переполнение стека! Ну, вы можете определить таймеры в System.Threading.Timer или вам придется работать с примитивами синхронизации потоков (Mutex и Event). И это должно происходить во время работы someLongFunction? 06.03.2013
  • У меня не было stackoverflow, но, возможно, у меня было слишком короткое время работы приложения. Я должен добавить, что если я напишу SomeControl += 1 вместо SomeControl = info.someField; это работает нормально. 06.03.2013
  • Я не говорил, что вы ПОЛУЧИЛИ stackoverflow, но в конечном итоге вы ПОЛУЧИТЕ его, рекурсивно вызывая свой метод снова и снова. 06.03.2013
  • Я попробую сделать это с помощью таймера. Мне тоже интересно, почему SomeControl += 1 отлично работает вместо SomeeControlee = info.somerfield. Вы знаете что-нибудь об этом? 06.03.2013
  • Это потому, что вы назначаете новую ссылку на свой объект, геттер/сеттер не вызывается таким образом! 06.03.2013

Ответы:


1

Если вам действительно нужны непрерывные обновления представления, вам не нужно создавать для этого поток, потому что тогда вам придется делать эти обновления в потоке Dispatcher (поток пользовательского интерфейса). Вместо этого вы можете использовать класс DispatcherTimer, который был построен именно для такой ситуации, когда вы можете указать интервал, и DispatcherTimer будет периодически вызывать ваш метод с этим интервалом и будет делать это автоматически в потоке Dispatcher.

06.03.2013
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..