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
}

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

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

            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 速度,当 CPUs 更快时,它可能会在未来中断):

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 而不是幻数来指定超时,并且您可能应该有一个特定的例外class 对于这种情况。

为此目的设置超时

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