我有一个相当普遍的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();
答案 0 :(得分:1)
你应该在循环体中做某事,否则它将消耗你所有的CPU(至少一个核心)。通常在这种类型的循环中,你会使用System.Threading.Thread.Sleep(100)
或其他东西睡一会儿。 Sleep
需要等待再次检查while条件之前等待的毫秒数。理想情况下,RDP对象会有一个互斥锁或事件,或者你可以阻止它直到断开连接的东西,但如果他们把它排除在外就不会让我感到惊讶。
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;
}