使用ZeroMQ的不安全代码后,Windows窗体的可疑行为

时间:2018-01-27 03:49:32

标签: c# visual-studio pointers zeromq

我在C#中的Windows Form应用程序中使用ZeroMQ。 ZeroMQ使用Publisher-Subscriber模式,由3个发布者组成,用于发布3种不同类型的数据。以下是代码段 -

var ZmqContext = new ZContext();
ZmqContext.SetOption(ZContextOption.IO_THREADS, 3);

var DataType1Publisher = new ZSocket(zmqContext, ZSocketType.PUB);
var DataType2Publisher = new ZSocket(zmqContext, ZSocketType.PUB);
var DataType3Publisher = new ZSocket(zmqContext, ZSocketType.PUB);

DataType1Publisher.SetOption(ZSocketOption.CONFLATE, 1);
DataType1Publisher.Bind("tcp://*:10001");
DataType2Publisher.SetOption(ZSocketOption.CONFLATE, 1);
DataType2Publisher.Bind("tcp://*:10002");
DataType3Publisher.SetOption(ZSocketOption.CONFLATE, 1);
DataType3Publisher.Bind("tcp://*:10003");

DataType1Publisher.Send(new ZFrame(DataType1ByteArray));
DataType2Publisher.Send(new ZFrame(DataType2ByteArray));
DataType3Publisher.Send(new ZFrame(DataType3ByteArray));

DataType1ByteArrayDataType2ByteArrayDataType3ByteArray是通过将byteuint数据转换为float手动合成的byte数组数组如下 -

int MAX_LENGTH = 100;
byte[] DataType1ByteArray = new byte[MAX_LENGTH];
int DataType1ByteArrayIndex = 0;

unsafe private void AddUint(uint point)
{
    byte* bytePtr = (byte*)&point;

    for (int i = 0; i < sizeof(uint); i++)
    {
        DataType1ByteArray[DataType1ByteArrayIndex++] = bytePtr[i];
    }
}

unsafe private void AddFloat(float point)
{
    byte* bytePtr = (byte*)&point;

    for (int i = 0; i < sizeof(float); i++)
    {
        DataType1ByteArray[DataType1ByteArrayIndex++] = bytePtr[i];
    }
}

以下是我的观察 -

  1. 代码可以平稳运行几个小时,并以大约700 MBPS的速率成功传输数据。
  2. 5-6小时后停止传输任何数据。
  3. Visual Studio中未报告任何错误。
  4. 当我在PC(Windows 10)中看到“任务管理器”时,以太网显示0Kbps。
  5. 请注意,代码适用于BitConverter。但是,为了加快速度,我使用了byte* bytePtr = (byte*)&point,因为它比BitConverter快得多。

    虽然我不确定它是否会出现某种内存泄漏。如何调试此问题并使其工作?有任何解决方法吗?

0 个答案:

没有答案