写入同一文件同时延迟

时间:2014-10-15 11:37:35

标签: c# file

我正在使用异步工作的套接字服务器程序。我需要将传入的数据包写入单个文件。一次连接数百个客户端,可以同时写入文件。以下是将接收到的数据包写入文件的代码...

static ManualResetEvent signal = new ManualResetEvent(false);
signal.WaitOne();
using (StreamWriter sw = new StreamWriter(path, true))
       sw.WriteLine(message);
signal.Set();

问题在于它减慢了要接收的下一个数据包的速度。

2 个答案:

答案 0 :(得分:4)

你需要解读你的阅读和写作。您可以使用队列来完成此操作。

创建单个线程安全的消息队列(ConcurrentQueue会让人想到)。

客户端将消息推送到队列中。

单个编写器从队列中弹出消息并将每个消息依次提交给磁盘(来自多个线程的并发文件IO通常都是性能杀手)。

现在,您需要的唯一同步由队列处理,因此很好地消除了死锁/阻塞的潜在来源,并且消费者/生产者链的两端都能够以最快的速度工作。

或者,看看TPL DataFlow。它是为这些生产者/消费者情况而建造的。这是你值得投入的时间。

答案 1 :(得分:0)

您不清楚如何接收数据。如果按照我的想法执行操作,则可以异步运行日志操作(修复代码):

// define this somewhere to lock access to "path" file
private readonly object _lock = new object();

Task.Run(() =>
    {
        lock(_lock)
        {
            using (StreamWriter sw = new StreamWriter(path, true))
                sw.WriteLine(message);
        }
    });