如何用多个线程写入单个文件?

时间:2011-11-07 10:14:03

标签: c# multithreading file-io

我在C#中创建Windows应用程序,我想用多个线程编写多个文件。我从不同的端口获取数据,并且每个端口都有一个文件。是否有可能为每个端口创建线程并一次又一次地使用相同的线程将数据写入相应的文件? 假设我从端口10000,10001,10002获取数据,并且有三个文件,如10000.txt,10001.txt和10002.txt。我必须分别创建三个线程来将数据写入这三个文件,我想一次又一次地使用这些线程。可能吗?如果可能,请您提供一小部分代码吗?

3 个答案:

答案 0 :(得分:9)

正如评论中提到的,这是在寻找麻烦。

因此,您需要一个线程安全的编写器类:

public class FileWriter
{
    private ReaderWriterLockSlim lock_ = new ReaderWriterLockSlim();
    public void WriteData(/*....whatever */)
    {
        lock_.EnterWriteLock();
        try
        {
            // write your data here
        }
        finally
        {
            lock_.ExitWriteLock();
        }
    }

} // eo class FileWriter

这适合被许多线程调用。但是,有一个警告。可能存在锁定争用。我使用了一个ReadWriterLockSlim类,因为你可能也想要读锁,而且该类允许你从读状态升级。

答案 1 :(得分:3)

你对其他帖子的答案与你原来的问题有些不一致 - 似乎你想要为每个帖子写一个不同的文件。

简单的答案就是......只需这样做 - 文件系统是线程安全的。唯一的障碍可能是只有一个磁盘的性能。同时快速地将小块数据写入许多文件可能导致大量磁盘抖动,因为文件系统试图仅用一个转子臂来处理分布式文件/目录。具有大缓存和智能控制器的现代硬盘将在一定程度上缓解这种情况,但您可能遇到问题。试试看吧!

如果您计划不断创建和销毁线程,打开和关闭每个传入网络读取的数据文件,您的问题将会增加。如果您可以避免这种情况,请执行此操作。

如果磁盘无法跟上,你可以实现一些聪明的“懒惰写入”算法,以增加磁盘写入的大小,从而减少数量,或购买SSD,或两者兼而有之。

答案 2 :(得分:0)

您需要序列化线程并管理关闭和打开文件调用。并且可能使用append而不是write ..您可以使用线程管理器类(更像是主线程)来帮助同步所有其他线程。 虽然最好的办法可能是使用一个专用于写入该文件的线程..