我的问题是与我的同事讨论C++与C#的争论.
我们已经实现了一个接收大量UDP流的服务器.此服务器使用异步套接字和使用完成端口的重叠I/O在C++中开发.我们使用5个完成端口和5个线程.该服务器可以轻松处理千兆网络上的500 Mbps吞吐量,而不会丢失数据包/错误(我们没有将测试推送到500 Mbps以上).
我们尝试在C#中重新实现相同类型的服务器,但我们无法达到相同的传入吞吐量.我们使用异步接收使用ReceiveAsync方法和池SocketAsyncEventArgs来避免为每个接收调用创建新对象的开销.每个SAEventArgs都有一个缓冲区设置,所以我们不需要为每次接收分配内存.该池非常非常大,因此我们可以排队超过100个接收请求.此服务器无法处理超过240 Mbps的传入吞吐量.超过该限制,我们在UDP流中丢失了一些数据包.
我的问题是:我应该期望使用C++套接字和C#套接字获得相同的性能吗?我的观点是,如果在.NET中正确管理内存,它应该是相同的性能.
附带问题:有人会知道一篇很好的文章/参考资料,解释.NET套接字如何使用I/O完成端口吗?
如果我在Microsoft SQL Server数据库中有NVARCHAR(或NTEXT)数据类型的字段,那么PostgreSQL数据库中的等效数据类型是什么?
如何使用C#从互联网或服务器获取当前日期和时间?我想时间如下:
public static DateTime GetNetworkTime (string ntpServer)
{
IPAddress[] address = Dns.GetHostEntry(ntpServer).AddressList;
if (address == null || address.Length == 0)
throw new ArgumentException("Could not resolve ip address from '" + ntpServer + "'.", "ntpServer");
IPEndPoint ep = new IPEndPoint(address[0], 123);
return GetNetworkTime(ep);
}
Run Code Online (Sandbox Code Playgroud)
我正在传递服务器IP地址netServer,但它无法正常工作.
我在.Net中使用System.Drawing.Image进行从png到jpeg的简单转换.我基本上只使用这两行代码:
Image img = Image.FromFile(filename);
img.Save(newFilename, System.Drawing.Imaging.ImageFormat.Jpeg);
Run Code Online (Sandbox Code Playgroud)
它工作正常,除了png文件由于alpha通道包含透明度.在这种情况下,转换的jpeg具有黑色背景.有没有办法让背景变白?
是否有人熟悉获取与进程ID关联的应用程序池的方法?我正在使用Win32_Process查询W3WP服务并返回PID现在我正在尝试获取与之关联的应用程序池.
我曾经在一个常见做法是使用Pair Programming的地方工作.我记得在共同编写代码时我们可以相互学习多少小事.随着时间的推移,提取新的快捷方式,代码片段等,显着提高了编写代码的效率.
自从我开始使用SQL Server以来,我一直独自离开.我通常会选择与其他人合作的最佳习惯,这是我现在无法做到的.
所以这是一个问题:
编辑:
我担心你可能会被你们中的一些人误解.我不是在寻找有关编写高效TSQL代码的技巧,而是寻求有关如何有效使用Management Studio来加快编码过程本身的建议.
我正在寻找的答案类型是:
基本上那些使编码体验更有效和愉快的小东西.
我不确定这是否可行.
我目前正在开展一个大学项目,我有一个使用存储过程的函数.我想知道是否可以采用相同的SqlCommand实例并应用更新的参数在同一函数内再次调用存储过程.
让我说我的代码中有这样的东西:
myConStr = ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString;
myConn = new SqlConnection(myConStr);
myCommand = new System.Data.SqlClient.SqlCommand("team5UserCurrentBooks3", myConn);
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.AddWithValue("@book_id", bookID);
myCommand.Parameters.AddWithValue("@user_id", userID);
try
{
myConn.Open();
myCommand.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
是否可以更新MyCommand参数并再次调用存储过程?
我已声明了一个通用事件处理程序
public delegate void EventHandler();
Run Code Online (Sandbox Code Playgroud)
我添加了扩展方法'RaiseEvent':
public static void RaiseEvent(this EventHandler self) {
if (self != null) self.Invoke();
}
Run Code Online (Sandbox Code Playgroud)
当我使用典型语法定义事件时
public event EventHandler TypicalEvent;
Run Code Online (Sandbox Code Playgroud)
然后我可以调用使用扩展方法没有问题:
TypicalEvent.RaiseEvent();
Run Code Online (Sandbox Code Playgroud)
但是当我使用显式添加/删除语法定义事件时
private EventHandler _explicitEvent;
public event EventHandler ExplicitEvent {
add { _explicitEvent += value; }
remove { _explicitEvent -= value; }
}
Run Code Online (Sandbox Code Playgroud)
那么使用显式添加/删除语法定义的事件上不存在扩展方法:
ExplicitEvent.RaiseEvent(); //RaiseEvent() does not exist on the event for some reason
Run Code Online (Sandbox Code Playgroud)
当我将鼠标悬停在活动上,看看它说的原因:
事件'ExplicitEvent'只能出现在+ =或 - =的左侧
为什么使用典型语法定义的事件与使用显式添加/删除语法定义的事件不同,以及为什么扩展方法不适用于后者?
编辑:我发现我可以直接使用私有事件处理程序解决它:
_explicitEvent.RaiseEvent();
Run Code Online (Sandbox Code Playgroud)
但我仍然不明白为什么我不能直接使用事件,就像使用典型语法定义的事件一样.也许有人可以开导我.
有没有人知道一些关于为Visual Studio 2010编写插件/插件的好文章/教程?
为什么C#泛型不能像C++模板中那样从泛型类型参数中派生出来?我的意思是我知道这是不可能的,因为CLR不支持这个,但为什么呢?
我知道C++模板和C#泛型之间的深刻差异 - 前者是编译时实体,必须在编译期间解析,而后者是一流的运行时实体.
不过,我没有看到的原因,为什么CLR的设计者并没有拿出一个方案,该方案将最终使CLR泛型类型从泛型类型参数的一个派生.毕竟,这将是非常有用的功能,我个人非常想念它.
编辑:
我想知道一个核心问题,解决这个问题会产生如此高的代价来实现这个功能,这个功能证明它还没有得到实施.例如,检查这个虚构的声明:
class C<T> : T
{
}
Run Code Online (Sandbox Code Playgroud)
正如Eric Lippert已经注意到" 如果T是一个结构怎么办?如果T是一个密封的类型怎么办?如果T是一个接口类型怎么办?如果T是C怎么办?如果T是从C语言中得到什么怎么办?"如果T是带抽象方法的抽象类型?如果T的可访问性低于C怎么办?如果T是System.ValueType怎么办?(你能否有一个继承自System.ValueType的非结构?)System.Delegate怎么样? System.Enum等等? "
正如埃里克继续说的那样," 那些是容易的,显而易见的 ".的确,他是对的.我感兴趣的是一个既不容易也不明显的问题的具体例子,这个问题很难解决.