C# может ли один и тот же синглтон записи файлов использоваться для одновременной записи в несколько файлов

Например, могу ли я сделать синглтон, который записывает в файлы, а затем использовать его в нескольких потоках для одновременной записи в разные файлы? Или есть какой-то нежелательный побочный эффект, о котором я не думаю? Сложно протестировать каждый сценарий в демонстрационном приложении, поэтому надеялся на какое-то руководство. Программа записи Singleton File выглядит так.

       public sealed class CustomFileWriter
       {
         private static CustomFileWriter(){}

         public static CustomFileWriter Instance
         {
                    get
                    {
                        lock (padlock)
                        {
                            if (instance == null)
                            {
                                instance = new CustomFileWriter();
                            }
                            return instance;
                        }
                    }
         }
         WriteToFile(string fileName, string contents)
         {
          // other business logic goes here that is not specific to the question.
          File.AppendAllText(fileName, contents)
         }
       }

Для этого нет причин; вы должны использовать File напрямую.

SLaks 13.09.2018 20:41

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

Goku 13.09.2018 20:42

Имеет ли значение порядок, в котором происходят эти многопоточные записи?

Ron Beyer 13.09.2018 20:44

@RonBeyer они не заботятся о порядке (каждый файл независим). но есть несколько потоков UDP, которые будут записывать разные файлы, и каждый вызывает этот синглтон, иногда одновременно

Goku 13.09.2018 20:45

Проблема этого подхода заключается в том, что поток A будет заблокирован потоком B, даже если они записывают в разные файлы. Если вы хотите сделать что-то подобное, я бы подумал о том, чтобы сделать одноэлементный "поток-статический", чтобы класс был одноэлементным для каждого потока, а не для всего домена приложения.

Ron Beyer 13.09.2018 20:51

См. Этот вопрос: stackoverflow.com/questions/22719596/…

Ron Beyer 13.09.2018 20:52

@RonBeyer Будет ли использование File.AppendAllText блокировать потоки? Это статический класс

Goku 13.09.2018 20:55

Только для текущего потока это вызов блокировки, но он не блокирует другие вызовы к нему. Все, что делает AppendAllText, - это создает StreamWriter и записывает текст в поток в блоке using. Вы можете увидеть код на справочном источнике.

Ron Beyer 13.09.2018 21:03

@RonBeyer Отлично, можно ли одновременно создавать новые потоки? Если это так, я просто перейду с синглтона, чтобы разрешить несколько экземпляров

Goku 13.09.2018 21:06

Да, можно создавать / использовать несколько потоков одновременно, мир был бы темным местом, если бы они не могли быть ...

Ron Beyer 13.09.2018 21:08
0
10
145
0

Другие вопросы по теме