当我关闭它时,为什么应用程序仍在运行
我想这是因为从串口读取数据引起的。
从ComboBox中选择串口号
函数WriteData更新复选框取决于串行端口的数据
这是摘录:
// 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) { ... }
答案 0 :(得分:3)
您的代码很可能导致死锁,在Close()调用中阻止您的程序。问题陈述是Dispatcher.Invoke()调用。在UI线程调度调用之前,该调用无法完成。当您调用Close()并且DataReceived事件正忙于执行时,会发生死锁。 Close()调用无法完成,因为事件正在运行。事件处理程序无法完成,因为Invoke()无法完成,因为UI线程不是空闲的,它停留在Close()调用中。死锁城市。
这是特别是可能会在您的代码中发生,因为它有一个错误。您在DataReceived中调用DiscardInBuffer()。这会抛弃收到的数据,因此下一个ReadChar()调用将暂停一段时间,等待接收更多数据,如果设备不再发送任何数据,可能会永远停止。
通过删除DiscardInBuffer()调用并使用Dispatcher.BeginInvoke()代替修复此问题。