c#while循环使用

时间:2015-03-17 01:36:11

标签: c# winforms rdp mstsc

我有一个相当普遍的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
}

/ ********************************************** **************** /

这是我按照James'使用的最终代码。回答。  计数器足以满足我的目的。

            int i = 0;
            rdp1.Disconnect();
            while (rdp1.Connected == 1)
            {
                if (i == 1000 * 10) break;
                else Thread.Sleep(100);
                i++;
            }
            rdp1.Connect();

2 个答案:

答案 0 :(得分:1)

你应该在循环体中做某事,否则它将消耗你所有的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而不是幻数来指定超时,并且您可能应该有一个特定的异常类这种情况。

答案 1 :(得分:1)

为此目的设置超时

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;
}