2017-02-24 75 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(); 
}