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

C# 如何使用多个线程写入单个文件?,c#,multithreading,file-io,C#,Multithreading,File Io,我正在用C#创建Windows应用程序,我想在其中用多个线程写入多个文件。我从不同的端口获取数据,每个端口都有一个相关文件。是否可能为每个端口创建线程,并一次又一次地使用同一线程将数据写入相应的文件? 假设我从端口1000010011002获取数据,有三个文件,分别为10000.txt、10001.txt和10002.txt。我必须创建三个线程,分别将数据写入这三个文件,并且我希望反复使用这些线程。可能吗?如果可能的话,你能给出一个小的代码示例吗?你需要序列化线程并管理关闭和打开文件调用。可能使

我正在用C#创建Windows应用程序,我想在其中用多个线程写入多个文件。我从不同的端口获取数据,每个端口都有一个相关文件。是否可能为每个端口创建线程,并一次又一次地使用同一线程将数据写入相应的文件?
假设我从端口1000010011002获取数据,有三个文件,分别为10000.txt、10001.txt和10002.txt。我必须创建三个线程,分别将数据写入这三个文件,并且我希望反复使用这些线程。可能吗?如果可能的话,你能给出一个小的代码示例吗?

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

如评论中所述,但这会带来麻烦

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

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
类,因为您可能还需要执行读锁,而且该类还允许您从读状态升级。

您对其他帖子的回答与您最初的问题有些不一致-似乎您希望每个线程写入一个不同的文件

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

如果您计划持续创建和销毁线程,为每次传入的网络读取打开和关闭数据文件,您的问题将会增加。如果你可以避免这种情况,那么就这样做


如果磁盘无法跟上,您可以实施一些自己的智能“延迟写入”算法来增加磁盘写入的大小,从而减少写入的数量,或者购买SSD,或者两者兼而有之。

您需要序列化文件访问(例如通过互斥或类似方式)或者让一个中心线程负责写入文件,而其他线程只告诉文件要写入什么(将该中心线程要完成的工作排队)…为什么需要从多个线程写入单个文件?这是一个坏主意,不仅是从同步,甚至是从写入文件的机制(锁等).在这里,我不断地从不同的端口获取数据,并且有不同的文件。三是一个与单个端口关联的文件。我想将来自端口的数据写入相应的文件。我想为每个传入的数据创建线程,它会将数据写入特定文件并中止该文件,依此类推。请参见“感谢您的响应”,但我可以为一个特定文件创建一个专用线程,为另一个文件创建另一个线程吗?依此类推?@Dany-除非您有一个线程始终运行同一个线程,否则该线程将处理对您的任何文件的写入。即使接受的答案也不会产生新的线程来写入文件,只会防止多个线程在同一时间写入同一文件。感谢您的回复,我只写了一个写入文件的方法,并且只为该方法传递不同的参数。但是如果我对写入方法使用锁,那么只有一个线程可以访问该方法。这对我没有任何用处。@Dany,多线程加上+1文件=坏消息。您的使用案例是什么?多线程加+1文件不是我的案例。我的案例是多线程和多文件。>>ReaderWriterLockSlimlock-是打字错误吗?@Konstantin,看起来是更正类名的人弄错了-将编辑:)