Thread.Sleep和Task.Delay随机挂起并且永远不会结束

时间:2018-09-07 08:44:05

标签: c# task console-application thread-sleep windows-server-2016

不可重复。正下方的代码也会挂起,并使控制台等待输入“随机”-某个地方的潜在问题更大。

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);
    }

2 个答案:

答案 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来解决此问题

https://social.msdn.microsoft.com/Forums/vstudio/en-US/f1d6d2e3-417f-4bc4-be83-1e659852d6cb/application-hang-when-using-remote-desktop?forum=vcgeneral