TPL TaskFactory.FromAsync vs任务与阻塞方法

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/ed8a14​​e8-d19a-42d1-bc3f-7017bdfed09c

  • 请提供外部链接的内容.否则,如果链接中断,您的答案就毫无价值. (3认同)
  • 如果msdn休息,我们都毫无价值 (2认同)