具有多个发送者的 C# 单个 UDP 侦听器提供数据问题

C# single UDP listener with multiple senders giving data problems

我有一个程序(windows 服务)从多个发送者(目前约 20 个)接收来自 UDP 的数据。每个发件人 "bursts" 每 10 秒大约 30 行 CSV 数据。每天总共发送大约 12.000.000 行。

所有传入数据都存储在文本文件中,每天一个。每个文件的大小约为 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 是一个 class 将所有行附加到文本文件中

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 是否足够有效?

事实证明,我看错了问题的一端。数据通过 UDP 套接字传入,数据写入文件。

关于重启程序解决数据丢失的观察是不正确的。而且也不是我做的 - 你不能相信任何人.... :-)

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

非常感谢所有为 UDP 部分提供想法的人。