C# время использования цикла
У меня довольно общий вопрос о цикле C#.
Этот код должен продолжать выполняться только после того, как сеанс 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();
2 ответа
Вы должны сделать что-то в теле цикла, иначе он будет использовать весь ваш процессор (хотя бы для одного ядра). Обычно в этом типе цикла, вы будете спать некоторое время, используя 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
а не магическое число, и у вас, вероятно, должен быть определенный класс исключений для этого случая.
Установите тайм-аут для этой цели
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;
}