Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务延迟在专用线程上有意义吗?_C#_Multithreading - Fatal编程技术网

C# 任务延迟在专用线程上有意义吗?

C# 任务延迟在专用线程上有意义吗?,c#,multithreading,C#,Multithreading,我知道在任务中使用Thread.Sleep是一个愚蠢的想法,因为它会在线程池中阻塞该线程。 然而,如果我有一个由new-thread(new-ThreadStart(Foo))创建的线程,Task.Delay还有意义吗?无论如何,没有任何东西会使用该线程。我还想知道一项任务的确切效果。延迟会有什么影响。它不会使线程休眠,所以它会充当旋转等待吗?那会比睡觉更糟糕。不是吗?我很难从这个问题中看出这里的情况是什么;这似乎表明您正在分配一个线程,然后希望它在一段时间内什么也不做。这是一件奇怪的事情,为一

我知道在任务中使用Thread.Sleep是一个愚蠢的想法,因为它会在线程池中阻塞该线程。
然而,如果我有一个由
new-thread(new-ThreadStart(Foo))
创建的线程,Task.Delay还有意义吗?无论如何,没有任何东西会使用该线程。我还想知道一项任务的确切效果。延迟会有什么影响。它不会使线程休眠,所以它会充当旋转等待吗?那会比睡觉更糟糕。不是吗?

我很难从这个问题中看出这里的情况是什么;这似乎表明您正在分配一个线程,然后希望它在一段时间内什么也不做。这是一件奇怪的事情,为一个无所事事的工人付钱。请澄清情况

要回答您的具体问题:

它不会使线程休眠,所以它会充当旋转等待吗

没有

那会比睡觉更糟糕。不是吗

是的,那太可怕了!它会有一根线的所有下侧,但会消耗能量并在过程中产生热量。您不仅需要支付分配线程的开销,还需要积极地浪费电源,而没有任何好处。您唯一想要旋转等待的时间是在等待比线程数量要短得多的时间内发生的事情时。旋转等待纳秒或最坏情况下,等待微秒,而不是毫秒。你想要旋转等待一些指令,我们每秒运行数十亿条指令

基于您的问题,我的怀疑是:(1)您根本不了解Task.Delay是做什么的,(2)您不必要地分配了一个线程

让我们先说一下Task.Delay的作用

Task.Delay
立即返回一个对象,该对象表示延迟若干毫秒的任务

这就是它的全部功能

真的

它实际上不会延迟任何毫秒数它返回一个代表延迟概念的任务。确保你的头脑清楚

如果您询问任务是否完成,它当然会告诉您该秒数是否已过

如果指定某个函数作为该任务的延续,该延续将计划在任务完成后的某个时间点在当前上下文上运行

然后,
等待任务的是什么。延迟(无论什么)做什么

我刚才说了它的作用<代码>任务。延迟
返回表示延迟的任务<代码>等待检查任务是否完成。如果是,则程序继续正常运行。如果任务未完成,则等待
的位置将成为任务的继续点,并且该方法将返回给其调用方。然后,计划在任务完成后的某个时间点在当前上下文上执行延续


我不知道也不理解,为什么你会雇佣一名工人来做这件事。雇佣工人做CPU密集型的工作,在完成之前,他们不会停止敲击CPU一纳秒。不要雇佣工人做一次延迟几毫秒的事情,比如访问磁盘或延迟工作

简单:不要将TPL与线程混合。第三方物流正是为了不必处理线程。您很可能需要一个
任务。运行(()=>Foo())
并使
Foo()
成为一个
异步任务
,使用
等待任务。延迟
。不过,请注意,大多数睡眠/延迟的使用都是为了解决问题,而不是solutions@CamiloTerevinto如果
Foo
已经是异步的,那么就没有理由从
Task.Run
@Servy调用它。我很清楚这一点,但是如果没有
Task.Run
它就不会像发布的代码那样从另一个线程调用。这完全取决于Foo做了什么,这个问题令人困惑;这个问题的前提似乎是,您有一个专门用于CPU密集型任务的线程,并且希望它将工作延迟几秒钟。这似乎是一个矛盾。你能解释一下你为什么要这么做吗?