是否将使用从EAP创建的任务的额外线程?

时间:2012-07-10 12:31:15

标签: c# task-parallel-library

我有一个基于事件的异步操作(EAP)的类。我可以根据它描述here创建一个任务。

当我使用EAP时:

我的主题 - >通话方法 - >创建线程 - >它做了什么。

当我创建任务时,我怀疑:

我的主题 - >创建任务 - > 创建线程 - >调用方法 - >创建线程 - >它做了什么。

是真的吗?

编辑:

Offcourse任务不会创建一个线程 - 如果需要,它将从线程池中获取线程。但它会被采用,我是否必须从线程池中花费宝贵的额外线程?

2 个答案:

答案 0 :(得分:1)

要准确了解会发生什么,我需要查看您的具体代码,包括您将如何使用生成的Task

但一般情况下,如果使用Task将EAP封装到TaskCompletionSource中,它将不会使用池中的另一个线程,因为没有代码可以执行。

如果您的意思是在ContinueWith()上使用Task会发生什么情况,那么这取决于您是否设置了TaskContinuationOptions.ExecuteSynchronously。如果不设置,则继续将在从池中取出的“新”线程上运行。如果你设置了它,它将在设置Task结果的同一个线程上运行。 (你应该只使用ExecuteSynchronously进行非常短的延续。)

但是,延续是否会从池中获取新线程,或者它是否使用由其他人从池中获取的线程并不重要。重要的是在操作完成之前是否会有任何线程阻塞。在这两种情况下,情况都不会发生。

答案 1 :(得分:0)

它不会创建两个新线程。事实上,它甚至不确定它会创建一个新的线程。它可能只是从ThreadPool中选择一个已存在的那个。