首页 新闻 会员 周边 捐助

c# begininvoke为什么这么慢

0
[已解决问题] 解决于 2024-02-05 09:34


同样的一个空方法,遍历1000000次,BeginInvoke用了3秒多
异步还没有同步快吗?

teagueli的主页 teagueli | 初学一级 | 园豆:75
提问于:2021-09-07 20:42
< >
分享
最佳答案
0

在你的这个场景下当然, 异步有上下文的切换, 多个上下文对象的创建和GC等. 自然慢的得多.

异步在什么情况下有优势?
例如要等待IO(例如等待数据库响应, 网络响应, 磁盘响应), 线程暂停x秒之类的类似情况.
io举例:
100并发同步读取: 系统要维持100个thread同步等待io返回.
100并发异步读取: 请求发出去之后进入异步等待(保存当前的上下文信息, 释放线程), io返回后从threadpool里面获得线程并恢复上下文信息激活异步调用. 这样子系统只要维护少量的thread. 大概可以这么理解.

奖励园豆:5
czd890 | 专家六级 |园豆:14488 | 2021-09-07 22:33

谢谢您的讲解。
如果我在上面的代码中的Calc函数中写了比较复杂的业务处理逻辑,会不会异步会占优势一些?

teagueli | 园豆:75 (初学一级) | 2021-09-08 11:13

@寻找薛定谔的猫:

假设你的calc方法里面有类似网络,文件io等待之类的, 1000000个并发执行很可能程序要直接挂逼的. 所以不一定是恰当的.

假设你的calc方法里面都是cpu密集型计算(比如加解密)并且你的host是多核的, "有可能"会提高性能(如果threadpool设置合理的化.)

要更好的评估该怎么做, 还是需要尽量提供更多有效信息 哈哈. 总之一句话 需要具体问题具体分析.

czd890 | 园豆:14488 (专家六级) | 2021-09-08 11:32

@czd890: 谢谢老师

teagueli | 园豆:75 (初学一级) | 2021-09-08 13:59
其他回答(1)
0

单个线程异步不一定会比同步块,异步不是加快程序运行时间,异步只是提高了服务器的吞吐率,简单就是提高了线程的利用效率,不让线程闲置

不知道风往哪儿吹 | 园豆:2037 (老鸟四级) | 2021-09-08 10:00

谢谢老师

支持(0) 反对(0) teagueli | 园豆:75 (初学一级) | 2021-09-08 13:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册