在我的应用程序中,我有一个字段DependentPC
的对象,它可以保存IP地址或网络共享。如果它是一个IP地址,它会执行一个简单的Ping并存储结果,但如果它是一个网络共享,我需要它继续检查共享,直到它存在或经过指定的时间。这是我到目前为止所得到的:
//Determines if it's a network share or not.
if (appToRun.DependentPC.Contains(@"\"))
{
var startTime = DateTime.Now;
var directoryInfo = new DirectoryInfo(appToRun.DependentPC);
//do until true or timeout reached.
while (DateTime.Now - startTime < TimeSpan.FromSeconds(Convert.ToInt32(DependentPCTimeout)) || !directoryInfo.Exists) { }
if (!directoryInfo.Exists)
{
XtraMessageBox.Show($"Could not find or get a reply from the computer share '{appToRun.DependentPC}'. ", $"{appToRun.DependentPC} Not Found", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return false;
}
}
else
{
//Ping computer.
if (PingComputer(appToRun.DependentPC) != IPStatus.Success)
{
XtraMessageBox.Show($"Could not find or get a reply from the computer '{appToRun.DependentPC}'. ", $"{appToRun.DependentPC} Not Found", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return false;
}
}
变量DependentPCTimeout
的值为50,网络共享为“\ 192.168.103.100 \ WorkingFolder。所以这一点有效。当使用网络共享时,它似乎总是等到时间在继续之前已经过去了,即使目录存在。我尝试使用带有while循环的单个OR |
,但这似乎使它永远锁定。
答案 0 :(得分:2)
在条件语句中使用OR运算符时,如果第一个条件为TRUE,则跳过其余条件。
在您的情况下, DateTime.Now - startTime&lt; TimeSpan.FromSeconds(...)在一段时间内始终为真。
我建议您可以像这样实施
//do until true or timeout reached.
while (!directoryInfo.Exists) {
if (DateTime.Now - startTime > TimeSpan.FromSeconds(Convert.ToInt32(DependentPCTimeout)))
break;
}
答案 1 :(得分:0)
您需要检查两个条件都是真的,而不是其中一个条件为真。所以你需要使用AND而不是OR:
//Determines if it's a network share or not.
if (appToRun.DependentPC.Contains(@"\"))
{
var startTime = DateTime.Now;
var directoryInfo = new DirectoryInfo(appToRun.DependentPC);
//wait until directory exists or timeout reached.
while (DateTime.Now - startTime < TimeSpan.FromSeconds(Convert.ToInt32(DependentPCTimeout)) && !directoryInfo.Exists) { }
if (!directoryInfo.Exists)
{
XtraMessageBox.Show($"Could not find or get a reply from the computer share '{appToRun.DependentPC}'. ", $"{appToRun.DependentPC} Not Found", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return false;
}
}
else
{
//Ping computer.
if (PingComputer(appToRun.DependentPC) != IPStatus.Success)
{
XtraMessageBox.Show($"Could not find or get a reply from the computer '{appToRun.DependentPC}'. ", $"{appToRun.DependentPC} Not Found", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return false;
}
}