相关疑难解决方法(0)

何时使用Task.Delay,何时使用Thread.Sleep?

什么时候使用Task.DelayThread.Sleep有很好的规则?

  • 具体来说,是否有一个最小值来提供一个有效/高效的另一个?
  • 最后,由于Task.Delay导致异步/等待状态机上下文切换,是否有使用它的开销?

c# multithreading task-parallel-library

343
推荐指数
5
解决办法
20万
查看次数

Thread.Sleep vs Task.Delay?

我知道Thread.Sleep阻止线程.

Task.Delay也阻止?或者它就像是Timer使用一个线程进行所有回调(当不重叠时)?

(这个问题不包括差异)

c# multithreading .net-4.0 .net-4.5

54
推荐指数
1
解决办法
2万
查看次数

如何在C#Async/Await应用程序中创建循环服务?

我编写了一个类,该方法在线程池中作为长时间运行的Task运行.该方法是一种监视服务,用于定期发出REST请求以检查另一个系统的状态.它只是一个while()循环,里面有一个try()catch(),这样它就可以处理自己的异常,并在发生意外情况时正常继续.

这是一个例子:

public void LaunchMonitorThread()
{
    Task.Run(() =>
    {
        while (true)
        {
            try
            {
                //Check system status
                Thread.Sleep(5000);
            }
            catch (Exception e)
            {
                Console.WriteLine("An error occurred. Resuming on next loop...");
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但我想知道是否有另一种模式我可以使用它将允许Monitor方法作为标准Async/Await应用程序的常规部分运行,而不是使用Task.Run()启动它 - 基本上我'我试图避免火灾和遗忘模式.

所以我尝试重构代码:

   public async Task LaunchMonitorThread()
    {

        while (true)
        {
            try
            {
                //Check system status

                //Use task.delay instead of thread.sleep:
                await Task.Delay(5000);
            }
            catch (Exception e)
            {
                Console.WriteLine("An error occurred. Resuming on next loop...");
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在另一个异步方法中调用该方法时,我得到了有趣的编译器警告:

"因为没有等待这个调用,所以在调用完成之前,当前方法的执行仍在继续."

现在我认为这是正确的,我想要的.但我怀疑是因为我是async/await的新手.这段代码是按照我预期的方式运行还是以DEADLOCK或其他致命的方式运行?

c# asynchronous async-await

2
推荐指数
1
解决办法
82
查看次数