我想知道在使用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) 我希望这不是滥用stackoverflow; 最近我在Parallel Extensions上看到了一些很棒的问题,引起了我的兴趣.
我的问题:你使用的是Parallel Extensions,如果有的话,怎么样?
我的名字是Stephen Toub,我是微软的并行计算平台团队的成员.我们是负责Parallel Extensions的小组.我一直很想知道开发人员如何利用Parallel Extensions(例如Parallel.For,PLINQ,ConcurrentDictionary等),积极的体验,你曾经拥有的负面体验,对未来的特征要求等等.上.
如果您愿意分享此类信息,请在此处作为对此问题的回复,或通过电子邮件私下给我stoub at microsoft dot com.
我非常期待收到你的来信.
提前致谢!
我发现[...] Async和Begin [...] .net异步API之间存在差异,但这个答案让我有点困惑.
谈到这些模式,斯蒂芬说:
大多数*异步方法(具有相应的*已完成事件)正在使用基于事件的异步模式.较旧(但仍然完全有效)的Begin*和End*是一种称为异步编程模型的模式.
Socket类是此规则的一个例外; 它的*异步方法没有任何相应的事件; 它本质上只是APM以避免过多内存分配的方式完成的.
我得到它使用*Async方法更有效,至少在套接字方面.但后来他提到任务并行库:
但是,APM和EBAP都被基于任务并行库的更灵活的方法所取代.由于TPL可以轻松地包装APM,因此较旧的类可能不会直接更新; 扩展方法用于为旧的APM方法提供Task等价物.
我在MSDN上发现了TPL和传统.NET异步编程,我知道TPL的基础知识,创建任务,取消,延续等等,但我仍然无法理解这些:
异步编程模型(APM)和基于事件的异步模式(EAP)相互比较的优势是什么?TPL如何轻松地包装 APM意味着APM和EAP都被 TPL 取代?
最重要的是:我应该在套接字编程中使用哪个;
c# sockets design-patterns asynchronous task-parallel-library
我已经为我的服务器编写了这段代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Threading;
using System.Net.Sockets;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
private static bool terminate;
public static bool Terminate
{
get { return terminate; }
}
private static int clientNumber = 0;
private static TcpListener tcpListener;
static void Main(string[] args)
{
StartServer();
Console.Read();
}
private static void StartServer()
{
try
{
Console.WriteLine("Server starting...");
tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8000);
terminate = false;
tcpListener.Start();
tcpListener.BeginAcceptTcpClient(ConnectionHandler, null);
Console.ReadLine();
} …Run Code Online (Sandbox Code Playgroud) 我有一个WCF服务,它使用套接字异步,我有一些性能问题,所以我决定重构代码,我读了一些关于F#的异常和多线程的易用性的文章,等等,但我想知道使用F#parallelism我会获得更好的性能吗?并且它很容易与WCF服务兼容,我有大量的数据应该通过套接字传输(在tcp上),因此拥有良好的性能和并行算法非常重要.
c# ×3
asynchronous ×2
sockets ×2
task ×2
.net ×1
c#-4.0 ×1
c#-to-f# ×1
f# ×1
plinq ×1
taskfactory ×1
tcp ×1
tcpclient ×1
tcplistener ×1