此服务器解决方案是否最佳?

约翰尼凯奇2019

我创建了从传感器接收数据(大约 80k 样本/秒)并通过 TCP/IP 将它们发送到我的 PC 应用程序的设备。问题是有时我的设备会丢失一些数据。我想这是因为当我通过 TCP/IP 处理器发送数据时需要一些时间来做到这一点,然后他有一段时间没有从传感器接收数据。我注意到当我在发送之前收集一些数据时,它发生的频率较低,所以我在 data.Length 大于 30000 时发送数据。感谢您的建议。有我的服务器代码:

while (true)
{
    if (ClientIsConnected==1)
    {
        value = Convert.ToString(sensor1.Read(0)); ; // Publish the return value 

        DateTime currentDate = DateTime.Now;
        long elapsedTicks = currentDate.Ticks - startDate.Ticks;
        TimeSpan elapsedSpan = new TimeSpan(elapsedTicks);
        time = Convert.ToString(elapsedTicks / 100);

        data.Append("[" + value + " " + time + "]" + "/n");
        if (data.Length > 30000)
        {
            serverTcp.Send(socket, Convert.ToString(data));
            data.Clear();
        }
    }   
}

编辑两个不同的线程代码:

object msg = null;

if (ClientIsConnected==1)
{
    var threadTcp = new Thread(() =>
    {
        server.Send(socket, Convert.ToString(data));
    });

    var threadReadAdc = new Thread(() =>
    {
        value = Convert.ToString(Sensor1.Read(0)); ; // Publish the return value
      
        DateTime currentDate = DateTime.Now;
        long elapsedTicks = currentDate.Ticks - startDate.Ticks;
        TimeSpan elapsedSpan = new TimeSpan(elapsedTicks);
        time = Convert.ToString(elapsedTicks / 100);

        data = data.Append("[" + value + " " + time + "]" + "\n");
        if (data.Length > 30000)
        {
            msg = Convert.ToString(data);
            data.Clear();
        }
    });
    
    threadReadAdc.Start();
    threadTcp.Start();
}
查理

我会BlockingCollection<string>在这里使用类似的东西

https://docs.microsoft.com/en-us/dotnet/api/system.collections.concurrent.blockingcollection-1?view=net-5.0

您可以设置一个字符串集合,在一个线程中写入该集合并在另一个线程中读取。读取可以将结果存储在缓冲区中,并在缓冲区足够满时通过 TCP 发送(或已经过去了足够的时间 - 这取决于您)。

阻塞集合是线程安全的,读取将阻塞,直到有东西要读取。

例如


var data = new BlockingCollection<string>();

Task taskWrite = Task.Run(() =>
{
    while(true)
    {
        var sensorReading = Convert.ToString(sensor1.Read(0)); // Do your string time/formatting here too - I left it off for clarity
        data.Add(sensorReading);
    }
});

Task taskRead = Task.Run(() => {
    var buffer = List<string>();

    while(true)
    {
        if(buffer.Count > 30000) 
        {
            // Grab contents of buffer and send via TCP
            server.Send(socket, String.Join("\n", buffer));
            buffer.Clear();
        }
        else 
        {
            // Consume the next sensor value from the collection
            buffer.Add(data.Take());
        }
    }
});

如果您想确保不会用值填满内存(例如,如果您的读取速度比写入速度快得多),您还可以在阻塞集合上设置边界。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

服务器的备份解决方案?

(游戏)服务器是否有“无服务器”解决方案?

什么是python服务器的最佳解决方案文件上传

文件服务器,家庭备份解决方案

在服务器上构建解决方案时出错

在Web脱机应用程序中从服务器缓存json的最佳解决方案是什么?

此解决方案是否使 eval 安全?

一种简单的解决方案,用于检查Web服务器上是否存在文件。(迅速)

在Linux下制作交互式TCP / UDP服务器是否有解决方案?

是否有用于生成客户端和服务器的restfual api代码的任何解决方案

制作此动画的最佳解决方案是什么

是否有解决此死锁的解决方案?

在同一解决方案中针对服务器运行集成测试

选择在客户端/ API /服务器解决方案中编写逻辑的正确位置

Google云端硬盘的无服务器解决方案观看更改

多服务器部署的ASP.net解决方案注意事项

有哪些免费的远程桌面(服务器)解决方案?

报告服务器的多线程解决方案(而不是多进程)

C#/ Mono解决方案未在远程Dokku服务器上构建

制作Node.js服务器的独立解决方案

将Powerpoint转换为基于PDF服务器的解决方案?

将Visual Studio 2012解决方案迁移到其他服务器的NOT版本

将系统放入服务器的错误消息有什么解决方案?

用于家庭服务器而非ZFS的RAID解决方案

用于家庭服务器而非ZFS的RAID解决方案

Nuget 还原任务如何工作?解决方案中的 nuget.config 是否必须与构建服务器中的 nuget.config 匹配?

最佳推荐解决方案

Minizinc,Gecode,如何通过多解决方案模型在分布式服务器上获得相同的解决方案?

在构建服务器上构建项目时,如何解决解决方案级别的预构建事件宏?