具有多个发送者的C#单个UDP侦听器给数据带来了问题

时间:2018-12-07 16:12:14

标签: c# .net udp

我有一个程序(Windows服务),该程序从多个发件人处接收UDP数据(目前约20个)。每个发件人每10秒“突发”大约30行CSV数据。每天总共发送大约1200万行。

所有传入数据均存储在文本文件中,每天一次。每个文件的大小约为1 GB。但有时我们的每日文件只有〜180 MB。这是非常一致的-一个或另一个,从不介于两者之间。 因此,有时我们会丢失约80%的传入数据。

我已经验证,发件人总是发送大约相同数量的数据。因此它位于我们接收器中的某个位置。

UDP接收器基本上是这样构建的:

using (UdpClient client = new UdpClient(listenPort))
{
    client.Client.ReceiveBufferSize = 8388608;

    while (!cancellationTokenSource.Token.IsCancellationRequested)
    {
            var result = await client.ReceiveAsync().ConfigureAwait(false);
            var textData = Encoding.ASCII.GetString(result.Buffer);
            await dataHandler.Handle(textData);
    }
}

dataHandler 是一个将所有行附加到文本文件中的类

public async Task Handle(string data)
{
    using (StreamWriter writer = File.AppendText(Path.Combine(this.outputPath, GetFilename())))
    {
        await writer.WriteLineAsync(data);
    }
}

private string GetFilename()
{
    return DateTime.Now.ToString("yyyy-MM-dd") + ".csv";
}

在我进行其他研究之前:上面的代码中是否有任何内容可能导致我看到的问题? UDP侦听器还是文件写入?

编辑:数据丢失在白天是均匀分布的,所以我想知道这与文件写入有关吗?由于在午夜创建了新文件。为每行实例化一个新的StreamWriter是否足够有效?

1 个答案:

答案 0 :(得分:0)

结果是,我正在寻找问题的错误答案。数据进入UDP套接字,数据写入文件。

关于重新启动程序解决了数据丢失的观察是错误的。而且还不是我做的-您不能相信任何人....:-)

程序正在VMWare虚拟机中运行,并且存储是SAN。我发现问题出在正在写入的文件中。有些文件放置在SAN内部的错误位置。如果我重命名或删除文件,以便自动创建一个新文件,则所有数据都会保存,并且不会丢失数据。

非常感谢对UDP部分有新见解的所有人。