繁体   English   中英

将任务和线程池一起使用是否可以?

[英]Is it fine to use tasks and thread-pool together?

读线程池和任务是如何工作后, 这个文章中,我提出了这个问题-

如果我有一个复杂的程序,其中一些模块使用tasks ,一些使用thread pool ,是否可能由于不同的用途会有一些调度问题?

任务通常使用线程池实现(当然也可以使用其他类型的调度程序来执行任务,这些调度程序提供不同的行为,但这是默认设置)。 就正在执行的实际代码而言(假设您的任务代表正在运行的代理),确实没有太大区别。

任务只是围绕该线程池调用创建一个包装器,以便在收集有关该异步操作的信息和处理该异步操作的结果时提供其他功能。 如果您想利用其他功能,请使用任务。 如果您不需要在某些特定上下文中使用它,则直接使用线程池没有任何问题。

混合两者,只要你没有从这些操作的结果中得到你想要的东西,根本不是问题。

不,不会有问题 - 你只会做两者效率低下。 使用真正需要的东西并坚持使用模式。 请记住确保您的应用程序MT安全,特别是如果您从不同的线程访问相同的资源/变量等,无论您使用哪种线程算法。

不会。混合方法实际上并没有太多记忆或性能低效的方法; 默认情况下,任务使用线程池线程使用的相同线程池。

混合两者的唯一显着缺点是代码库缺乏一致性。 如果你选择一个,我会使用TPL,因为它有一个丰富的API来处理多线程的许多方面,并利用async / await语言功能。

由于您的使用是按模块行划分的,因此您不必担心。

不应该有任何调度问题,但当然最好使用Tasks并让Framework决定如何处理预定的工作。 在当前版本的框架(4.5)中,除非使用LongRunning选项,否则工作将通过ThreadPool排队,但此行为可能在将来发生变化。

结论:混合任务和ThreadPool不是问题,但对于新应用程序,建议使用Tasks而不是直接在ThreadPool上排队工作项(原因之一是ThreadPool在Windows 8运行时(现代UI应用程序)中不可用) 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM