小编Mic*_*lli的帖子

C#中的队列和等待句柄

我已经在我的应用程序中使用了以下代码多年,并且从未见过它的问题.

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可以执行任何操作并且特定于其实现之后,编辑稍微更改了问题).

.net c# queue multithreading autoresetevent

5
推荐指数
1
解决办法
5413
查看次数

多个Parallel.ForEach调用,MemoryBarrier?

我有一堆数据行,我想使用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)

c# multithreading task-parallel-library parallel.foreach

5
推荐指数
1
解决办法
1118
查看次数

Tcp Socket已关闭

我一直认为如果你没有实现心跳,就无法知道TCP连接的一端是否意外死亡.如果进程刚刚被杀死并且没有正常退出,则套接字无法发送FIN或让对方知道它已关闭.

(请参阅此处的一些评论,例如http://www.perlmonks.org/?node_id=566568)

但是我连接的股票订单服务器有一个新的"取消断开连接所有订单",如果客户端断开连接,则会取消实时订单.它甚至在我杀死我的过程时也能工作,并且我的应用程序肯定没有心跳.

那么它是如何能够检测到我杀死这个过程的?我的应用程序在Windows Server 2003上运行,订单服务器在Suse Linux Enterprise Server 10上.Windows是否检测到与套接字关联的进程不再存在并发送FIN?

sockets tcp

4
推荐指数
1
解决办法
7707
查看次数

Ascii Bytes数组到Int32或Double

我正在重写一个图书馆,其任务是完全免费分配.目标是在应用程序的启动阶段完成后拥有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)

.net c# byte ascii int32

1
推荐指数
1
解决办法
2677
查看次数

模拟插座硬断开

我有一个C#应用程序,其中服务器和一些客户端使用套接字从不同的计算机进行通信.

大多数情况下,服务器在sock.Receive(...)调用中接收到0个字节时会正确检测到断开连接.但是当出现硬件问题时(例如拔掉网络电缆),就会出现问题.一个服务器线程继续在sock.Receive(...)上阻塞,因为它不知道连接丢失了.我打算添加一个心跳消息来检测这个,但我想在dev中测试它.

但我不确定如何在没有实际硬件问题的情况下测试这种情况.即使我刚刚终止客户端进程,套接字也会以某种方式设法优雅地断开连接(也就是说,服务器读取0字节).只有当我从网络中拔出客户端机器时才会看到此问题.

有什么方法可以在dev中模拟这个问题吗?

.net c# sockets networking

1
推荐指数
1
解决办法
3195
查看次数

Localhost在Windows上表现更好吗?

我有一个.NET 3.5服务器应用程序,通常有大约8个客户端.我正在使用System.Net.Sockets所有的网络.

我被告知如果客户端在同一个盒子上运行,它应该使用localhost:<port>127.0.0.1:<port>代替机器的ip或名称以获得更好的性能.有几个人在工作时说这会跳过tcp堆栈的某些层.

但是我在测试中根本无法看到任何性能差异(使用System.Diagnostics.Stopwatch计算从服务器到客户端获取ping数据包需要多长时间).

理论上真的应该有更好的表现吗?

.net c# sockets networking

1
推荐指数
1
解决办法
162
查看次数