Подтвердить что ты не робот

Как писать в одном файле с несколькими потоками?

Я создаю приложение Windows на С#, в котором я хочу писать в нескольких файлах с несколькими потоками. Я получаю данные из разных портов, и есть один файл, связанный с каждым портом. Возможно, что создание потока для каждого порт и использовать тот же поток снова и снова для записи данных в соответствующий файл? Предположим, что я получаю данные из портов 10000,10001,10002, и есть три файла: 10000.txt, 10001.txt и 10002.txt. Я должен создать три потока для записи данных в эти три файла соответственно, и я хочу использовать эти потоки снова и снова. Возможно ли это? Пожалуйста, можете ли вы дать небольшой образец кода, если это возможно?

4b9b3361

Ответ 1

Как уже упоминалось в комментариях, это вызывает проблемы.

Итак, у вас должен быть потокобезопасный класс записи:

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, потому что вы можете также делать блокировки чтения и ад, этот класс также позволяет вам обновиться и из состояния чтения.

Ответ 2

Ответы на другие сообщения несколько не соответствуют вашему оригинальному вопросу - кажется, вы хотите писать в один файл в каждом потоке.

Простой ответ: просто сделайте это - файловая система поточно-безопасна. Единственная загвоздка может быть производительностью только с одним диском. Одновременное и быстрое создание небольших фрагментов данных во многих файлах может привести к большому количеству извлечения диска, поскольку файловая система пытается справиться с распределенными файлами/каталогами только с одним плечом ротора. Современные жесткие диски с большими кэшами и умными контроллерами в некоторой степени смягчат это, но у вас может быть проблема. Попробуйте и посмотрите!

Ваши проблемы будут увеличены, если вы планируете постоянно создавать и уничтожать потоки, открывать и закрывать файлы данных для каждой входящей сети. Если вы можете избежать этого, сделайте это.

Если диск не может идти в ногу с ним, вы можете реализовать собственный алгоритм "ленивого написания", чтобы увеличить размер записи на диске и, следовательно, уменьшить число, или купить SSD, или и то, и другое.

Ответ 3

Вам нужно сериализовать потоки и управлять закрытием и открытием вызовов файлов. И, вероятно, используйте append вместо write. Вы могли бы использовать класс диспетчера потоков (более похожий на основной поток), чтобы помочь синхронизировать все ваши другие потоки. Хотя лучше всего было бы использовать один поток, предназначенный для записи в этот файл.