当前位置: 首页 > 知识库问答 >
问题:

何时使用任务。延迟,何时使用线程。睡觉

蒲勇
2023-03-14

是否有关于何时使用任务的好规则。延迟对线程。睡觉

  • 具体来说,是否存在一个最低值,以确保其中一个有效/高效
  • 最后,自任务。延迟会导致异步/等待状态机上的上下文切换,使用它会有开销吗

共有3个答案

邵文乐
2023-03-14

我想补充一些东西。实际上,任务。延迟是一种基于计时器的等待机制。如果您查看源代码,您会发现对负责延迟的Timer类的引用。另一方面Thread。睡眠实际上使当前线程Hibernate,这样你只是阻塞和浪费一个线程。在异步编程模型中,您应该始终使用任务。延迟()如果你想要的事情(继续)发生后,一些延迟。

申屠秦斩
2023-03-14

任务之间最大的区别。延迟线程。睡眠是一项任务。延迟旨在异步运行。使用任务没有意义。同步代码中的延迟。使用线程是一个非常糟糕的主意。在异步代码中睡眠

通常你会调用任务。Delay()wait关键字:

await Task.Delay(5000);

或者,如果您想在延迟之前运行一些代码:

var sw = new Stopwatch();
sw.Start();
Task delay = Task.Delay(5000);
Console.WriteLine("async: Running for {0} seconds", sw.Elapsed.TotalSeconds);
await delay;

猜猜这会打印什么?运行0.0070048秒。如果我们将等待延迟移动到控制台上方。WriteLine相反,它将打印5.0020168秒。

让我们看看线程的区别。睡眠

class Program
{
    static void Main(string[] args)
    {
        Task delay = asyncTask();
        syncCode();
        delay.Wait();
        Console.ReadLine();
    }

    static async Task asyncTask()
    {
        var sw = new Stopwatch();
        sw.Start();
        Console.WriteLine("async: Starting");
        Task delay = Task.Delay(5000);
        Console.WriteLine("async: Running for {0} seconds", sw.Elapsed.TotalSeconds);
        await delay;
        Console.WriteLine("async: Running for {0} seconds", sw.Elapsed.TotalSeconds);
        Console.WriteLine("async: Done");
    }

    static void syncCode()
    {
        var sw = new Stopwatch();
        sw.Start();
        Console.WriteLine("sync: Starting");
        Thread.Sleep(5000);
        Console.WriteLine("sync: Running for {0} seconds", sw.Elapsed.TotalSeconds);
        Console.WriteLine("sync: Done");
    }
}

试着预测这会打印什么。。。

异步:启动
异步:运行0.0070048秒
同步:启动
异步:运行5.0119008秒
异步:完成
同步:运行5.0020168秒
同步:完成

另外,有趣的是注意到线程。睡眠要准确得多,ms的准确度并不是一个真正的问题,而任务。延迟最短可能需要15-30毫秒。与ms精度相比,这两个函数的开销都很小(如果需要更精确的东西,请使用StopwatchClass)<代码>线程。睡眠仍然会束缚你的线程,任务。延迟在等待时释放它以执行其他工作。

百里智勇
2023-03-14

使用Thread。Hibernate当你想要阻止当前线程。

使用任务。延迟当您希望在不阻塞当前线程的情况下进行逻辑延迟时。

在这些方法中,效率不应该是首要考虑的问题。它们在现实世界中的主要用途是作为I/O操作的重试计时器,而不是毫秒。

 类似资料:
  • 我有一个异步任务执行器。如何让Spring在所有任务完成之前等待应用程序关闭?

  • 我正在尝试在JavaFX中编写某种第一人称视角3D游戏,到目前为止,该运动效果非常好。 我使用JavaFX的内置shape和PerspectiveCamera类将图像渲染到场景中。 但是对于所有关键事件,输入延迟约为1-2秒。 滞后仅出现在: > 一旦程序切换到全屏(即使切换回窗口,它们仍然存在,但当程序刚刚启动时,它们仍然存在) 并且在按下/释放按钮之前不久使用鼠标旋转相机 例如:我按W前进,同

  • 问题内容: jQuery 1.5带来了新的Deferred对象和附加的方法,以及。 对于那些以前从未使用过的用户,我已经为其添加了注释。 这些新方法的可能用途是什么,我们如何将它们适应模式? 我已经阅读了API和[源代码,所以我知道它的作用。我的问题是我们如何在日常代码中使用这些新功能? 我有一个缓冲区类的简单示例,该类按顺序调用AJAX请求。(上一个完成后,下一个开始)。 我在寻找示威和可能的用

  • 在C#中,我有以下两个简单的例子: 第一个示例创建一个打印“开始”的任务,等待5秒钟打印“完成”,然后结束任务。我等待任务完成,然后打印“全部完成”。当我运行测试时,它会按预期运行。 第二个测试应该具有相同的行为,只是由于使用了async和Wait,任务内部的等待应该是非阻塞的。但是这个测试只打印“开始”,然后立即打印“全部完成”和“完成”,永远不会打印。 我不知道我为什么会有这样的行为:S非常感

  • 问题内容: 我是python和线程的新手。我已经编写了充当网络爬虫的python代码,并在网站中搜索特定的关键字。我的问题是,如何使用线程同时运行类的三个不同实例。当实例之一找到关键字时,所有三个实例都必须关闭并停止爬网。这是一些代码。 如何使用线程让Crawler同时执行三个不同的爬网? 问题答案: 似乎没有一种(简单的)方法可以终止Python中的线程。 这是一个并行运行多个HTTP请求的简单

  • 问题内容: 我将Q节点库用于Promises,我认为这个问题也适用于Bluebird库。 语境 我需要对自己的自定义函数和node.js 样式异步函数进行一些函数调用。 如果我正在调用这样的函数: 同步功能 并需要以上内容来执行此功能: 同步功能 并且需要调用类似于以下内容的本机节点函数: 异步功能 并需要以上内容来执行此功能: 同步功能 题 为了使我的所有函数“递延”或答应知道,在这里要做的“正