我有一个基于事件的异步操作(EAP)的类。我可以根据它描述here创建一个任务。
当我使用EAP时:
我的主题 - >通话方法 - >创建线程 - >它做了什么。
当我创建任务时,我怀疑:
我的主题 - >创建任务 - > 创建线程 - >调用方法 - >创建线程 - >它做了什么。
是真的吗?
编辑:
Offcourse任务不会创建一个线程 - 如果需要,它将从线程池中获取线程。但它会被采用,我是否必须从线程池中花费宝贵的额外线程?
答案 0 :(得分:1)
要准确了解会发生什么,我需要查看您的具体代码,包括您将如何使用生成的Task
。
但一般情况下,如果使用Task
将EAP封装到TaskCompletionSource
中,它将不会使用池中的另一个线程,因为没有代码可以执行。
如果您的意思是在ContinueWith()
上使用Task
会发生什么情况,那么这取决于您是否设置了TaskContinuationOptions.ExecuteSynchronously
。如果不设置,则继续将在从池中取出的“新”线程上运行。如果你设置了它,它将在设置Task
结果的同一个线程上运行。 (你应该只使用ExecuteSynchronously
进行非常短的延续。)
但是,延续是否会从池中获取新线程,或者它是否使用由其他人从池中获取的线程并不重要。重要的是在操作完成之前是否会有任何线程阻塞。在这两种情况下,情况都不会发生。
答案 1 :(得分:0)
它不会创建两个新线程。事实上,它甚至不确定它会创建一个新的线程。它可能只是从ThreadPool中选择一个已存在的那个。