据说,BeginReceive
和BeginSend
回调不是在.Net ThreadPool
上执行的,而是在IOCP ThreadPool
上执行的。对于高性能的服务器,IOCP线程必须尽快返回池,这意味着在BeginReceive
和BeginSend
回调过程中不需要进行繁重的工作。如果我调用一个异步方法并在回调中等待它,该怎么办。这是否意味着IOCP
线程将返回到线程池,当异步操作完成时,回调方法将在另一个可用的IOCP
线程上继续?
发布于 2015-02-26 18:14:13
AFAIK,不能保证这些回调将在IOCP线程上执行。
如果您使回调异步并使用await
,那么回调线程将返回到线程池(无论是IOCP线程还是常规线程池线程)。稍后,当异步方法恢复时,它将在一个常规线程池线程上恢复,而不是一个IOCP线程(AFAIK --这是无文档的,但只是有意义的)。
但是,我无法想象有一个用例会让您真正想要这样做。如果您使用 within a task-based API并始终使用async
/await
,代码将更加简洁。
发布于 2015-02-26 18:15:28
如果调用并await
一个async
方法,则将使用ThreadPool
线程执行延续(除非SynchronizationContext
或TaskScheduler
另有规定,这不是这种情况)。
但是,除非应该避免使用async
,否则不能进行回调。因此,我看不出您如何合理地在回调中await
任何内容。
将BeginX/EndX
转换为带有FromAsync
的Task
要简单得多,然后您就可以使用更多的控件处理它上的延续。例如,您可以指定TaskScheduler.Defaul
t,以确保ThreadPool
线程上运行延续。
var task = Task.Factory.FromAsync(BeginX, EndX,...);
task.ContinueWith(ante => {...}, null, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.Default)
https://stackoverflow.com/questions/28749340
复制相似问题