据说,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.Default,以确保ThreadPool线程上运行延续。
var task = Task.Factory.FromAsync(BeginX, EndX,...);
task.ContinueWith(ante => {...}, null, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.Default)https://stackoverflow.com/questions/28749340
复制相似问题