Jon*_*eus 20 networkstream task task-parallel-library taskfactory c#-4.0
我想知道在使用TPL TaskFactory.FromAsync和使用TaskFactory.StartNew阻塞版本的方法之间是否存在性能影响.我正在编写一个TCP服务器,它将支持不超过100个并发连接.在使用第一个选项编写代码并使用continue来链接多个读写操作之后,我留下了丑陋,难以调试的代码.
我相信用同步版本编写代码然后用Task包装它会降低复杂性并提高可测试性,但是我担心这样做的性能影响.
例如,这两个调用之间是否存在任何性能差异:
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));
Run Code Online (Sandbox Code Playgroud)
Dre*_*rsh 45
当API提供方法的BeginXXX/EndXXX版本时,您绝对想要使用FromAsync.不同之处在于,在类似Stream或者Socket或类似的情况下WebRequest,您实际上最终会在封面下使用异步I/O(例如,Windows上的I/O完成端口),这比阻止多个CPU线程做得更好.同步操作.这些方法提供了实现I/O可伸缩性的最佳方法.
查看MSDN上名为TPL和Traditional .NET异步编程的.NET SDK的这一部分,了解有关如何组合这两种编程模型以实现异步天堂的更多信息.
小智 5
从外部链接复制后:
是.在.NET 4中,任务并行库包含用于APM模式的内置包装器(开始/结束):Task.Factory.FromAsync.例如,如果要为Stream的BeginRead/EndRead方法调用创建任务,则可以执行以下操作:
Stream s = ...;
byte [] buffer = ...;
Task<int> numBytesRead = Task<int>.Factory.FromAsync(s.BeginRead, s.EndRead, buffer, 0, buffer.Length, null);
// or with await
int numBytesRead = await Task<int>.Factory.FromAsync(s.BeginRead, s.EndRead, buffer, 0, buffer.Length, null);
Run Code Online (Sandbox Code Playgroud)
http://social.msdn.microsoft.com/Forums/en/async/thread/ed8a14e8-d19a-42d1-bc3f-7017bdfed09c
| 归档时间: |
|
| 查看次数: |
19423 次 |
| 最近记录: |