2017-02-24 89 views
0

有一个循环遍历所有端口与特定端口连接。当端口迭代时,关闭窗体需要时间

但同时如果窗体关闭,则需要时间,当我暂停时,看到它卡住时,调试点位于serialport.open()的声明处。

因此,当应用程序请求打开端口,同时如果窗体关闭,它会挂起一段时间,如果超过6或7个端口需要更多时间。

示例代码:

string[] portNames = SerialPort.GetPortNames(); 

int detectPortCount = portNames.Length; 

for (int i = 0; i < detectPortCount; i++) 
{ 
    SerialPort discoveryPort = new SerialPort(); 
    discoveryPort.WriteTimeout = discoveryPort.ReadTimeout = 2000; 

     try 
     { 
      discoveryPort.PortName = portNames[i]; 
      try 
      { 
       if (!discoveryPort.IsOpen) discoveryPort.Open(); 
      } 
      catch (UnauthorizedAccessException uex) 
      { 
      } 
     } 
} 
+0

遗憾的是没有'超时'进行港口开放作业。所以你不能影响这一点。你可以做的是尝试使用'Task's或'Thread'来并行打开所有的端口。 ps“WriteTimeout”和“ReadTimeout”仅用于读写操作,不用于开放部分 –

+0

@Mong Zhu实际上是没有与PC连接的设备时的问题,这意味着没有连接建立,没有写入和读操作,仅在打开端口时出现问题。 – Harikrishna

+0

无论设备是否连接,您都应能够打开端口。通常,这些com端口有一个固定的名称,每次启动计算机时都不会更改。我通常在端口打开时检查设备是否连接,并且我可以收到一些东西。 –

回答

0

简短的回答:

您不能取消port.Open()方法,但是,这样它看起来像它关闭即刻就可以做到这一点。

由于@MongZhu建议您可以检查端口并行:

// Not inside the GUI Thread! 
ConcurrentDictionary<string, SerialPort> ports = new ConcurrentDictionary<string, SerialPort>(); 

Parallel.ForEach(SerialPort.GetPortNames(), (currentPort) => 
{ 
    SerialPort discoveryPort = new SerialPort(); 
    discoveryPort.WriteTimeout = discoveryPort.ReadTimeout = 2000; 

    try 
    { 
     discoveryPort.PortName = currentPort; 
     try 
     { 
      if (!discoveryPort.IsOpen) discoveryPort.Open(); 
      // do something to check if it's the right port here. 
      if(itIsTheRightPort) { 
       ports.TryAdd(currentPort, discoveryPort); 
      } 
     } 
     catch (UnauthorizedAccessException uex) 
     { 
     } 
    } 
}); 

此外,你可以关闭之前一直Hide()您的形式,它想:

public void OnClose(object sender, EventArgs e) 
{ 
    Form.Hide(); 
    WaitForAllTasksAndThreadsToFinishNiceAndClean(); 
    Close(); 
}