0

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

当我使用 EAP 时:

我的线程->调用方法->创建线程->在其中执行某些操作。

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

我的线程->创建任务->创建线程->调用方法->创建线程->在其中执行某些操作。

这是真的吗?

编辑:

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

4

2 回答 2

1

要确切知道会发生什么,我需要查看您的特定代码,包括您将如何使用生成的Task.

但一般来说,如果将 EAP 包装到Taskusing 中TaskCompletionSource,它不会用完池中的另一个线程,因为没有要执行的代码。

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

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

于 2012-07-10T13:33:50.010 回答
0

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

于 2012-07-10T12:34:47.660 回答