0

我有一个相当普遍的 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();
4

2 回答 2

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;
}
于 2015-03-17T02:06:23.847 回答
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而不是幻数来指定超时,并且您可能应该为这种情况设置一个特定的异常类。

于 2015-03-17T01:41:32.627 回答