Индивидуальный компонент для C # SerialPort - PullRequest
0 голосов
/ 13 февраля 2011

Я пишу компонент, у которого есть последовательный порт (C # Component) и некоторые другие функции и события: когда данные получены, они обрабатываются, затем выполняется соответствующее событие.

Моя проблема была: Когда событие выполнено, во время выполнения произошла следующая ошибка.

Операция с несколькими потоками недопустима: элемент управления «XXXXX» доступен из потока, отличного от потока, в котором он был создан.

Я искал и нашел эти решения.

  1. Использовать делегат и вызывать.
  2. Использовать ThreadPool.QueueUserWorkItem.

Но эти решения не запускают мое мероприятие немедленно.

Теперь я хочу, чтобы мое событие было немедленно выполнено без ошибок.

Спасибо.

Дополнительные описания:

Событие компонента таймера tick происходит после истечения времени, и внутри него вы можете работать с пользовательским интерфейсом. Поэтому я хочу, чтобы мои события были похожи на тик, и у меня есть собственный настраиваемый параметр CustomEventArgs и я собираюсь использовать его вместо EventArgs параметр, что мне делать?

Ответы [ 3 ]

1 голос
/ 13 февраля 2011

Я искал и нашел эти решения.

  1. Использовать делегат и вызывать.
  2. Использовать ThreadPool.QueueUserWorkItem.

Вариант 2) здесь не применим. Вариант 1) - ваше решение, вы найдете его достаточно быстрым. Это быстрее, чем пользователь, и это все, что имеет значение.

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

1 голос
/ 13 февраля 2011

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

0 голосов
/ 20 февраля 2011

Первое спасибо за ваши ответы.

Я нашел одно решение для ошибки "cross-thread ...", просто установите CheckForIllegalCrossThreadCalls = false; .

public Form1()
{
    InitializeComponent();
    CheckForIllegalCrossThreadCalls = false; //just add this
}

Хотя я обнаружил, почему задержка.

.Net SerialPort имеет свойство с ReceivedBytesThreShold именем и 1 значением по умолчанию. И обычно мой размер полученного пакета больше 50.

Накладные расходы было причиной задержки.

Справка MSDN для ReceivedBytesThreShold

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