【问题标题】:Are there any scenario where Tasks should not be used?是否有不应该使用任务的场景?
【发布时间】:2012-10-06 15:08:31
【问题描述】:

我正在阅读关于 Tasks 是使用 4.0 进行异步编程的首选方式。我只是想知道是否有任何用例不应该优先使用任务而不是普通的 c# 线程?

【问题讨论】:

    标签: c# .net multithreading task-parallel-library


    【解决方案1】:

    由于Tasks 使用底层的ThreadPool(除非标记为长期运行),因此在不建议使用ThreadPool 时使用它们是一个坏主意,例如

    • 长 I/O 操作会阻塞任务队列并阻止执行其他任务。
    • 执行需要线程标识的操作,例如设置亲和性。

    【讨论】:

    • 线程亲和性是一个很好的观点,尽管它很少出现。
    • 我建议仍将任务用于长时间运行的操作,只要将它们标记为 LongRunning。
    • @Dan Bryant:当然,因为在这种情况下,调度程序会被提示产生额外的线程。
    【解决方案2】:

    这里详细介绍: Should I notice a difference in using Task vs Threads in .Net 4.0?

    最大的不同是TaskFactory使用线程池,所以如果你有很多任务,它们可能不会立即启动。他们必须等待空闲线程运行。在大多数情况下,这是可以接受的..

    在硬件允许的情况下,只要调用 .Start(),线程就会立即运行。

    假设线程池没问题,任务提供了许多好处,包括取消、ContinueWith、OnSuccess、OnError、异常聚合和 WaitAll 等等。

    【讨论】:

    • 线程将在调用 .Start() 后立即准备就绪。它们将在内核可用时运行,这通常是“即时的”
    • 好点,我应该澄清线程是硬件限制的,而任务是软件限制的。
    • 谢谢达伦。该博客文章似乎也对各种方法进行了很好的比较。 nitoprograms.blogspot.ca/2010/08/…
    猜你喜欢
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2011-01-17
    相关资源
    最近更新 更多