【发布时间】:2020-05-25 13:29:39
【问题描述】:
How to pass LongRunning flag specifically to Task.Run()? 强调将任务创建标志放入较新的 API 中可能会有点混乱,尤其是使用 async 模式。
我发现这篇文章声称async 无论如何都不是一个好主意,不应该使用:http://blog.i3arnon.com/2015/07/02/task-run-long-running/
我的理解是,这个标志实际上会导致 TPL 启动一个专用线程而不是强调线程池,但特别是如果我的应用程序不涉及大量并行任务,这真的很重要吗?如果我的预期并行度小于默认线程池大小(无论是什么),我可以安全地忽略该标志吗?线程池可能会在几百毫秒内缺少线程吗?
【问题讨论】:
-
如果您忽略它,它不会完全中断,但如果您确实使线程池饱和,则可能需要更长的时间才能启动额外的线程来处理新任务。您是否有不想传递此值的原因?总是当我看到人们问“我想避免做 X,它安全吗?”我的直接问题总是“你为什么要避免做 X?”。
-
in practice will cause TPL to spin up a dedicated thread- this answer 从您的链接中解释说不会。也可能看到 blog.stephencleary.com/2013/08/startnew-is-dangerous.html 在第 3 项中讨论LongRunning。 -
@GSerg 您引用的链接与 OP 声称目前 TPL 通过启动专用线程来尊重
LongRunning标志的说法并不矛盾。只是不能保证这种行为会永远保持不变。有朝一日微软会修改已有十年历史的 API 行为的可能性是任何人的猜测。我的猜测是:概率很低。 -
当您问“我可以安全地忽略该标志”时,您的意思是“我可以安全地忽略该标志”吗?
-
@TheodorZoulias 确实,已更正