不可重复。正下方的代码也会挂起,并使控制台等待输入“随机”-某个地方的潜在问题更大。
int i = 0;
while (true)
{
Console.WriteLine(++i);
System.Threading.Thread.Sleep(3000);
}
所以我有最奇怪的错误,而且网上似乎也没有这个错误。我最近将任务计划程序移到了其他服务器(Windows Server 2016标准)上,并且由于该移动,应用程序似乎随机挂在Task.Delay行上,并且从不执行。
例如,它只会简单地说“检查是否在09:31完成下一次运行”,然后就不再执行。
有趣的是,在控制台窗口中按Enter键似乎触发了它的执行,但是每次它挂起睡眠时,直到应用程序关闭并重新打开。
它可能会持续很多天而没有遇到这个问题,然后似乎会随机出现。
我尝试使用Thread.Sleep而不是Task.Delay,并且两者都遇到相同的问题。我还添加了一个检查以查看Directory.Exists命令是否可能导致其挂起,因此将目录存储在内存中。
我不知道是什么原因造成的-我以前从未经历过类似的事情。有什么想法吗?
下面的代码-但是由于错误的怪异性质,因此无法复制id想像
TLDR: Windows Server 2016控制台应用程序挂在Task.Delay(和Thread.Sleep)上,直到在控制台窗口上按下键为止
// This is the main execution loop
while (true)
{
Task run = checkDirectoriesForAppsToRun();
run.Wait();
}
static async Task checkDirectoriesForAppsToRun()
{
Console.WriteLine("Starting apps...");
foreach (string subFolder in listOfSubfolders)
{
if (directoryExists.ContainsKey(currentDirectory + @"\" + subFolder) || System.IO.Directory.Exists(currentDirectory + @"\" + subFolder)) // Only if the sub directory exists!
{
if (directoryExists.ContainsKey(currentDirectory + @"\" + subFolder) == false)
directoryExists.Add(currentDirectory + @"\" + subFolder, true);
foreach (string directory in System.IO.Directory.GetDirectories(currentDirectory + @"\" + subFolder))
{
CheckDirectoryForApp(directory); // Load the apps xml file, and check if we need to run it.
}
}
else
{
Console.WriteLine(subFolder + " Doesn't exist in the root directory - Please check");
}
}
Console.WriteLine("Check completed next run at " + DateTime.Now.Add(timeToPause).ToShortTimeString());
await Task.Delay(timeToPause);
}
答案 0 :(得分:1)
为什么不使用System.Threading.Timer
而不是创建自己的循环版本?那是他们被创造的。请参阅有关以下问题的出色注释:为什么发布的代码将/可能会死锁,如果将同步调用与async/await
混合使用,这很容易做到,而且也不必使用async/await
您仅将其用于Task.Delay
private static System.Threading.Timer _timer;
static void Main(string[] args)
{
// start the timer
_timer = new System.Threading.Timer(checkDirectoriesForAppsToRun, null, 0, timeToPause);
}
static void StopTimer()
{
// call this method when you want to stop the timer
_timer?.Dispose();
}
static void checkDirectoriesForAppsToRun(object state)
{
Console.WriteLine("Starting apps...");
/* exising code not considered in this answer... */
Console.WriteLine("Check completed next run at " + DateTime.Now.Add(timeToPause).ToShortTimeString());
// await Task.Delay(timeToPause); // removed
}
答案 1 :(得分:1)
因此,这似乎是RDP连接性在运行时冻结.NET应用程序的问题。
在Windows Server 2008上不是问题-在更高版本的Windows Server上是一个问题。请参阅下面的链接。当前无法解决-放弃了RDP,改用VNC来解决此问题