簡體   English   中英

C#while循環用法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM