是否有关于何时使用任务的好规则。延迟对线程。睡觉
我想补充一些东西。实际上,任务。延迟
是一种基于计时器的等待机制。如果您查看源代码,您会发现对负责延迟的Timer
类的引用。另一方面Thread。睡眠实际上使当前线程Hibernate,这样你只是阻塞和浪费一个线程。在异步编程模型中,您应该始终使用
任务。延迟()
如果你想要的事情(继续)发生后,一些延迟。
任务之间最大的区别。延迟
和
线程。睡眠是一项任务。延迟
旨在异步运行。使用任务没有意义。同步代码中的延迟
。使用线程是一个非常糟糕的主意。在异步代码中睡眠
。
通常你会调用
任务。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精度相比,这两个函数的开销都很小(如果需要更精确的东西,请使用Stopwatch
Class)<代码>线程。睡眠任务。延迟
在等待时释放它以执行其他工作。
使用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 样式异步函数进行一些函数调用。 如果我正在调用这样的函数: 同步功能 并需要以上内容来执行此功能: 同步功能 并且需要调用类似于以下内容的本机节点函数: 异步功能 并需要以上内容来执行此功能: 同步功能 题 为了使我的所有函数“递延”或答应知道,在这里要做的“正