Система. Windows. Поточная обработка. Диспетчер и WinForms?

Это связано с тем, как работает Метеор.

Когда клиент запускается, у него еще нет данных. Затем клиент открывает подписки на сервере (при условии, что у вас все еще установлен пакет автоматической публикации по умолчанию, это сделано для вас), который вскоре отправляет данные.

Именно эта «вскоре после» часть является проблемой здесь.

В вашем случае это означает, что когда Tweets.findOne() выполняется, у него еще нет данных, и поэтому нет документа для чтения text. Таким образом, ошибка. Предотвратите ошибку, проверив, был ли возвращен документ:

Template.tweet.onCreated(function () {
  var doc = Tweets.findOne();
  if (doc) {
    this.text = new ReactiveVar(doc.text);
  }
});

Если вы попробуете это, ошибка исчезнет, ​​но текст по-прежнему не будет отображаться.

Итак, теперь мы хотим, чтобы этот участок кода запускался снова, когда доступны данные. Blaze делает это автоматически в помощниках, но везде вам нужно обернуть его в autorun:

Template.tweet.onCreated(function () {
  this.text = new ReactiveVar();
  this.autorun(() => {
    var doc = Tweets.findOne();
    if (doc) {
      this.text.set(doc.text);
    }
  });
});

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

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

Template.tweet.helpers({
  text() {
    var doc = Tweets.findOne();
    if (doc) return doc.text;
  },
});

Более того, нам больше не нужен ReactiveVar и мы можем удалить всю функцию onCreated! [ 1116]

28
задан David Schmitt 19 November 2008 в 19:49
поделиться

4 ответа

Используйте фоновый рабочий поток, поскольку это - знающий насос сообщения UI, Эта Статья MSDN, хотя главным образом о WPF действительно указывает, что BWT является UI, знающий даже для форм окон.

1
ответ дан 28 November 2019 в 03:23
поделиться

Диспетчер является компонентом WPF, не компонентом WinForms.

, Если бы Вы хотите диспетчеризировать объекты работы на потоке UI, тогда необходимо было бы или использовать Управление. BeginInvoke, поскольку Вы уже нашли или реагируете на ResetEvents/WaitObjects через потоки.

Обычно вызывающие объекты работы на потоке UI являются плохой вещью, если это не обрабатываемая деталь UI (т.е. обновление контента управления или чего-то), в этом случае Управление. BeginInvoke () был бы достаточен.

12
ответ дан 28 November 2019 в 03:23
поделиться

Вы можете использовать Dispatcher даже в приложении WinForms.

Если вы уверены, что находитесь в потоке пользовательского интерфейса (например, в обработчике button.Click), Dispatcher.CurrentDispatcher предоставляет диспетчер потоков пользовательского интерфейса, который впоследствии можно использовать для отправки из фоновых потоков в поток пользовательского интерфейса, как обычно.

21
ответ дан 28 November 2019 в 03:23
поделиться

Take a look at backgrounder and see if it fits your needs.

0
ответ дан 28 November 2019 в 03:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: