我已经在我的应用程序中使用了以下代码多年,并且从未见过它的问题.
while ((PendingOrders.Count > 0) || (WaitHandle.WaitAny(CommandEventArr) != 1))
{
lock (PendingOrders)
{
if (PendingOrders.Count > 0)
{
fbo = PendingOrders.Dequeue();
}
else
{
fbo = null;
}
}
// Do Some Work if fbo is != null
}
Run Code Online (Sandbox Code Playgroud)
其中CommandEventArr由NewOrderEvent(自动重置事件)和ExitEvent(手动重置事件)组成.
但我不确定这是否是线程安全的(假设N生成器线程在排队之前全部锁定队列,并且一个消费者线程运行上面的代码).此外,我们可以假设Queue.Count属性只从Queue类返回一个实例Int32值(没有volatile或者互锁或锁定等).
使用Queue和AutoResetEvent来解决这个问题的常用模式是什么,并且我正在尝试使用上面的代码做什么?
(在正确指出Queue.Count可以执行任何操作并且特定于其实现之后,编辑稍微更改了问题).
我有一堆数据行,我想使用Parallel.ForEach来计算每一行的某些值,就像这样......
class DataRow
{
public double A { get; internal set; }
public double B { get; internal set; }
public double C { get; internal set; }
public DataRow()
{
A = double.NaN;
B = double.NaN;
C = double.NaN;
}
}
class Program
{
static void ParallelForEachToyExample()
{
var rnd = new Random();
var df = new List<DataRow>();
for (int i = 0; i < 10000000; i++)
{
var dr = new DataRow {A = rnd.NextDouble()};
df.Add(dr);
}
// …Run Code Online (Sandbox Code Playgroud) 我一直认为如果你没有实现心跳,就无法知道TCP连接的一端是否意外死亡.如果进程刚刚被杀死并且没有正常退出,则套接字无法发送FIN或让对方知道它已关闭.
(请参阅此处的一些评论,例如http://www.perlmonks.org/?node_id=566568)
但是我连接的股票订单服务器有一个新的"取消断开连接所有订单",如果客户端断开连接,则会取消实时订单.它甚至在我杀死我的过程时也能工作,并且我的应用程序肯定没有心跳.
那么它是如何能够检测到我杀死这个过程的?我的应用程序在Windows Server 2003上运行,订单服务器在Suse Linux Enterprise Server 10上.Windows是否检测到与套接字关联的进程不再存在并发送FIN?
我正在重写一个图书馆,其任务是完全免费分配.目标是在应用程序的启动阶段完成后拥有0个集合.
以前,有很多这样的电话:
Int32 foo = Int32.Parse(ASCIIEncoding.ASCII.GetString(bytes, start, length));
Run Code Online (Sandbox Code Playgroud)
我认为这是分配一个字符串.我找不到一个自动执行相同操作的C#库函数.我查看了BitConverter类,但看起来只有当你的Int32使用代表它的实际字节进行编码时才会这样.这里,我有一个字节数组,表示代表Int32的Ascii字符.
这就是我做的
public static Int32 AsciiBytesToInt32(byte[] bytes, int start, int length)
{
Int32 Temp = 0;
Int32 Result = 0;
Int32 j = 1;
for (int i = start + length - 1; i >= start; i--)
{
Temp = ((Int32)bytes[i]) - 48;
if (Temp < 0 || Temp > 9)
{
throw new Exception("Bytes In AsciiBytesToInt32 Are Not An Int32");
}
Result += Temp * j;
j *= 10;
}
return …Run Code Online (Sandbox Code Playgroud) 我有一个C#应用程序,其中服务器和一些客户端使用套接字从不同的计算机进行通信.
大多数情况下,服务器在sock.Receive(...)调用中接收到0个字节时会正确检测到断开连接.但是当出现硬件问题时(例如拔掉网络电缆),就会出现问题.一个服务器线程继续在sock.Receive(...)上阻塞,因为它不知道连接丢失了.我打算添加一个心跳消息来检测这个,但我想在dev中测试它.
但我不确定如何在没有实际硬件问题的情况下测试这种情况.即使我刚刚终止客户端进程,套接字也会以某种方式设法优雅地断开连接(也就是说,服务器读取0字节).只有当我从网络中拔出客户端机器时才会看到此问题.
有什么方法可以在dev中模拟这个问题吗?
我有一个.NET 3.5服务器应用程序,通常有大约8个客户端.我正在使用System.Net.Sockets所有的网络.
我被告知如果客户端在同一个盒子上运行,它应该使用localhost:<port>或127.0.0.1:<port>代替机器的ip或名称以获得更好的性能.有几个人在工作时说这会跳过tcp堆栈的某些层.
但是我在测试中根本无法看到任何性能差异(使用System.Diagnostics.Stopwatch计算从服务器到客户端获取ping数据包需要多长时间).
理论上真的应该有更好的表现吗?