gpt4 book ai didi

c#-4.0 - TPL TaskFactory.FromAsync 与具有阻塞方法的任务

转载 作者:行者123 更新时间:2023-12-02 14:11:50 26 4
gpt4 key购买 nike

我想知道在方法的阻塞版本上使用 TPL TaskFactory.FromAsync 和使用 TaskFactory.StartNew 之间是否存在任何性能影响。我正在编写一个 TCP 服务器,它支持不超过 100 个并发连接。在使用第一个选项编写代码并使用 continue 链接多个读写操作后,我留下了丑陋且难以调试的代码。

我相信使用同步版本编写代码然后用任务包装它会降低复杂性并提高可测试性,但我担心这样做会对性能产生影响。

例如,这两个调用之间是否存在性能差异:

NetworkStream stream;
byte[] data;
int bytesRead;

//using FromAsync
Task<int> readChunk = Task<int>.Factory.FromAsync (
stream.BeginRead, stream.EndRead,
data, bytesRead, data.Length - bytesRead, null);

//using StartNew with blocking version
Task<int> readChunk2 = Task<int>.Factory.StartNew(() =>
stream.Read(data, bytesRead, data.Length - bytesRead));

最佳答案

当 API 提供 BeginXXX/EndXXX 版本的方法时,您绝对想要使用 FromAsync。不同之处在于,对于 StreamSocketWebRequest 之类的情况,您实际上最终会在底层使用异步 I/O覆盖(例如 Windows 上的 I/O 完成端口),这比阻塞多个 CPU 线程执行同步操作要高效得多。这些方法提供了实现 I/O 可扩展性的最佳方式。

查看 MSDN 上名为 TPL and Traditional .NET Asynchronous Programming 的 .NET SDK 部分有关如何结合这两种编程模型以实现异步必杀技的更多信息。

关于c#-4.0 - TPL TaskFactory.FromAsync 与具有阻塞方法的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5018897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com