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

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

3 ответов


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

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

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


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

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

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

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


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