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;
}
我有一个相当笼统的 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;
}