首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >异步/等待在BeginReceive回调中的应用

异步/等待在BeginReceive回调中的应用
EN

Stack Overflow用户
提问于 2015-02-26 17:50:30
回答 2查看 922关注 0票数 1

据说,BeginReceiveBeginSend回调不是在.Net ThreadPool上执行的,而是在IOCP ThreadPool上执行的。对于高性能的服务器,IOCP线程必须尽快返回池,这意味着在BeginReceiveBeginSend回调过程中不需要进行繁重的工作。如果我调用一个异步方法并在回调中等待它,该怎么办。这是否意味着IOCP线程将返回到线程池,当异步操作完成时,回调方法将在另一个可用的IOCP线程上继续?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-26 18:14:13

AFAIK,不能保证这些回调将在IOCP线程上执行。

如果您使回调异步并使用await,那么回调线程将返回到线程池(无论是IOCP线程还是常规线程池线程)。稍后,当异步方法恢复时,它将在一个常规线程池线程上恢复,而不是一个IOCP线程(AFAIK --这是无文档的,但只是有意义的)。

但是,我无法想象有一个用例会让您真正想要这样做。如果您使用 within a task-based API并始终使用async/await,代码将更加简洁。

票数 3
EN

Stack Overflow用户

发布于 2015-02-26 18:15:28

如果调用并await一个async方法,则将使用ThreadPool线程执行延续(除非SynchronizationContextTaskScheduler另有规定,这不是这种情况)。

但是,除非应该避免使用async,否则不能进行回调。因此,我看不出您如何合理地在回调中await任何内容。

BeginX/EndX转换为带有FromAsyncTask要简单得多,然后您就可以使用更多的控件处理它上的延续。例如,您可以指定TaskScheduler.Default,以确保ThreadPool线程上运行延续。

代码语言:javascript
运行
复制
var task = Task.Factory.FromAsync(BeginX, EndX,...);
task.ContinueWith(ante => {...}, null, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.Default)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28749340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档