Это application.dovents () мой единственный выбор (в этом случае)?

StackOverflow https://stackoverflow.com/questions/3839490

  •  27-09-2019
  •  | 
  •  

Вопрос

У меня есть коммерческое оборудование, к которой я могу подключиться к библиотеке .NET, поставляемой производителем оборудования - поэтому у меня нет контроля над библиотекой или оборудованием, только моим кодом.

Производитель установил свою систему, чтобы, если вы не подключены к оборудованию через их библиотеку, он работает нормально. Однако, когда вы подключитесь к своей библиотеке, есть неявное требование, которое вы обслуживаете насос Windows Message со скоростью, установленным тем, как быстро работает оборудование. Это связано с тем, что их библиотека реализует систему событий, которую вы можете подписаться на то, что вы можете подписаться на эту треск оборудования, но они предполагают, что ваш код приложения будет основан на основе WinForms. (Но в их документации нет ничего особенного - только то, что все 2 из программных программ .NET на примере .NET находятся на основе WinForms.) Я подтвердил свою техническую поддержку, что ожидание в том, что вы будете использовать приложение WinForms.

В моем случае я пишу приложение C #, неиспользуемое приложение, основанное на одном уровне (на самом деле служба Windows, поэтому у меня нет нити UI), и даже если я подключаюсь к оборудованию, я не подпишусь на любое из событий. В результате я обнаружил, что мне нужна ссылка на сборку WinForms и вызовов Application.Dovents () на достаточном достаточно ставках, чтобы обслуживать все эти события, на которые я не подпишусь.

Так что мои вопросы это:

  1. В этом случае требуется приложение.
  2. Или есть ли более современный способ сделать это?
  3. Каковы последствия вызова DoEvents () на уровне 20 мс?
  4. Не связан, но если я написал приложение на основе WPF, будет ли эта программа, скорее всего, обслуживать насос сообщений?

Редактировать

Я должен добавить, что если вы подключаетесь к оборудованию и не обслуживаете насос Windows Message (даже если не подписано ни одному из их событий), то водопад оборудования начинает вести себя непредсказуемо.

Редактировать 2.

Также нить, которую я использую для интерфейса к библиотеке, составляет около 2 или 3 поколения из исходной резьбы обслуживания Windows.

Это было полезно?

Решение

Это нормально, обычные предостережения для DoEvents не применяются здесь, потому что у вас нет пользовательского интерфейса. Нет последствий, скорость реалистична. Application.RUN () также накачивает цикл сообщения, но у вас будет труднее управлять нитью, поскольку вызов не возвращается. Да, WPF тоже накачивает петлю сообщений, но есть небольшая точка, используя его, так как у вас нет пользовательского интерфейса.

Вы должны инициализировать поток сервиса, вызывая SetaPattionState (), чтобы выбрать STA. Это гарантирует, что любой COM-сервер работает должным образом.

О, одна оговорка, которая прыгает на разум: вам нужно что-то сделать, чтобы помешать нити не сжигать 100% ядра. Он автоматически с Application.run (), но не с двумя пассажирами в «игровой петле». Я думаю, что вы уже делаете, так как вы можете указать скорость 20 мсеков. В противном случае, вызов WATHANDLE.WAITONE (20) на событии Service Stop Coving - это типичный подход.

Другие советы

Вы можете иметь сообщение насос без форм, просто позвоните версию Application.Run() это принимает А. ApplicationContext. или Нет параметров на нити.

Редактировать: я бы порекомендовал версию AmbiataitonContext, чтобы вы могли позвонить ApplicationContext.exitThread () в OnStop() вашего сервиса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top