Приложение не выходит
Почему приложение все еще работает, когда я закрываю его.
Я предполагаю, что это вызвано чтением данных из последовательного порта.
Номер последовательного порта выбирается из ComboBox.
Функция WriteData update устанавливает флажки в зависимости от данных с последовательного порта.
Вот выдержка:
// Choosing of communication port from ComboBox
private void comboBoxCommunication_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (serialPort.IsOpen)
{
serialPort.DataReceived -= new System.IO.Ports.SerialDataReceivedEventHandler(Recieve);
serialPort.Close();
}
try
{
ComboBoxItem cbi = (ComboBoxItem)comboBoxKomunikacia.SelectedItem;
portCommunication = cbi.Content.ToString();
serialPort.PortName = portCommunication;
serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Recieve);
serialPort.BaudRate = 2400;
serialPort.Open();
serialPort.DiscardInBuffer();
}
catch (IOException ex)
{
MessageBox.Show(ex.ToString(), "Error!", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
// Close the window
private void Window_Closed(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
serialPort.DataReceived -= new System.IO.Ports.SerialDataReceivedEventHandler(Recieve);
serialPort.Close();
}
}
// Data reading
private delegate void UpdateUiTextDelegate(char text);
private void Recieve(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
if (serialPort.IsOpen)
{
try
{
serialPort.DiscardInBuffer();
char c = (char)serialPort.ReadChar();
Dispatcher.Invoke(DispatcherPriority.Send,
new UpdateUiTextDelegate(WriteData), c);
}
catch(IOException ex)
{
MessageBox.Show(ex.ToString(), "Error!", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
}
// Update of checkboxes
private void WriteData(char c) { ... }
1 ответ
Ваш код может вызвать тупик, блокируя вашу программу при вызове Close(). Проблемой является вызов Dispatcher.Invoke(). Этот вызов не может быть завершен, пока поток пользовательского интерфейса не отправит вызов. Блокировка возникает, когда вы вызываете метод Close(), и в то же время событие DataReceived занята выполнением. Вызов Close() не может быть завершен, поскольку событие выполняется. Обработчик событий не может завершиться, потому что Invoke () не может завершиться, потому что поток пользовательского интерфейса не находится в режиме ожидания, он застрял в вызове Close(). Тупик город.
Это особенно вероятно в вашем коде, потому что в нем есть ошибка. Вы вызываете DiscardInBuffer() в DataReceived. Это отбрасывает полученные данные, поэтому следующий вызов ReadChar () будет блокироваться на некоторое время, ожидая получения еще нескольких данных, возможно, навсегда, если устройство больше ничего не отправляет.
Исправьте эту проблему, удалив вызов DiscardInBuffer() и используя вместо этого Dispatcher.BeginInvoke().