[英]c# while loop usage
我有一個相當籠統的c#while循環問題。
僅在RDP會話真正斷開連接后,此代碼才應繼續執行。
當Connected屬性更改為0時,表示RDP會話連接已真正終止。 當該屬性為1時,它仍然處於連接狀態,並且連接尚未終止。
有人看到此代碼有天生的不好嗎? 有更好的方法嗎?
private void Reconnect()
{
rdp1.Disconnect(); // force the RDP session to disconnect
while (rdp1.Connected == 1) // true as long as RDP is still connected
{
// do nothing
}
rdp1.Connect(); // execute this code after while loop is broken
}
/ ***************************************************** ************* /
這是我根據詹姆斯的回答使用的最終代碼。 計數器足以滿足我的目的。
int i = 0;
rdp1.Disconnect();
while (rdp1.Connected == 1)
{
if (i == 1000 * 10) break;
else Thread.Sleep(100);
i++;
}
rdp1.Connect();
您應該在循環體內執行某些操作 ,否則它將消耗所有CPU(至少對於一個內核而言)。 通常,在這種類型的循環中,您會使用System.Threading.Thread.Sleep(100)
或其他方法休眠一會兒。 Sleep
需要等待毫秒數才能再次檢查while條件。 理想情況下,RDP對象將具有互斥體或事件,或者您可以阻止它直到斷開連接為止,但是如果他們將其忽略,也不會感到驚訝。
編輯:正如Ben所指出的,同時也有一種擺脫循環的方法總是一個好主意。 這樣的事情(您所說的答案將取決於CPU速度,將來在CPU更快時可能會中斷):
DateTime stop = DateTime.UtcNow.AddSeconds(30);
while (rdp1.Connected)
{
if (DateTime.UtcNow > stop) throw new ApplicationException ("RDP disconnect timeout!");
System.Threading.Thread.Sleep (100);
}
當然,您可能希望使用常量,只讀TimeSpan
或可動態配置的TimeSpan
而不是幻數來指定超時,並且在這種情況下,您可能應該具有特定的異常類。
為此設置超時
private void Reconnect()
{
timeOut = false;
new System.Threading.Thread(new System.Threading.ThreadStart(setTimeout)).Start();
rdp1.Disconnect();
while (rdp1.Connected == 1 && !timeOut);
rdp1.Connect();
}
bool timeOut = false;
void setTimeout()
{
System.Threading.Thread.Sleep(7000);
timeOut = true;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.