Я работаю над приложением C # WinForms и хочу, чтобы оно могло открывать немодальное диалоговое окно, которое будет перерисовано и будет интерактивным одновременно с основным окном / формой.
В главном окне используется SerialPort и отображается количество передаваемых данных, которое постоянно увеличивается с помощью SerialDataReceivedEventHandler.
Я могу использовать ShowDialog (), который, кажется, работает в модальном режиме, но счетчики данных главного окна останавливаются во время использования диалога, и я думаю, что в конечном итоге последовательные буферы будут переполнены.
Я думаю, что хочу использовать Show (), но если я сделаю это, диалоговое окно появится на экране наполовину отрисованным, а затем не будет нарисовано или интерактивно (будет сброшено, если я перетяну через него другое окно). Он остается на экране, пока я не закрою главное окно приложения.
Возможно, мне следует запустить другой поток или, скорее всего, я просто делаю что-то не так. Я обычно не занимаюсь программированием на C # или Windows (может быть, вы можете сказать.)
Редактировать после комментариев (спасибо, комментаторы):
Я думаю, что, возможно, большинство вещей запускается в любом потоке, под которым вызывается обработчик событий последовательного получения. При запуске моего приложения я создаю класс для обработки серийного номера, который включает в себя:
com.DataReceived += new SerialDataReceivedEventHandler(SerialRxHandler);
Единственный код, который я написал для работы с потоками, - это некоторые функции для обновления счетчиков и списка журналов, которые, как я обнаружил, должны были быть обернуты с помощью InvokeRequired, чтобы я не получал жалоб на переключение потоков:
delegate void SetCountDelegate(TextBox tb, int count);
internal void SetCount(TextBox tb, int count) {
// thread switch magic
if (InvokeRequired) {
BeginInvoke(new SetCountDelegate(SetCount), new object[] { tb, count });
} else {
tb.Text = String.Format("{0}", count);
}
}
Так что, возможно, мне не следует пытаться показать () форму в этой теме. Еще один блок InvokeRequired, или я должен делать что-то совершенно по-другому?