Member 12821006 Ответов: 1

Я создал два потока для двух methds filewriting и filereading. При использовании синхронизации только один поток должен получить доступ либо к записи файлов, либо к чтению файлов.


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

Что я уже пробовал:

static void Main(string[] args)
        {
            demo Demo = new demo();
            Thread write = new Thread(new ThreadStart(Demo.FileWritting));
            write.Start();
            write.Join();
            Thread read = new Thread(new ThreadStart(Demo.FileReading));
            read.Start();
            read.Join();
        }
        
        public class demo
        {
            string path = @"D:/Demos.txt";
           public void FileWritting()
            {
               lock(this)
               {
                   if (!File.Exists(path)&&locking)
                   {
                       FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write);
                       StreamWriter sw = new StreamWriter(fs);
                       sw.WriteLine("Welcome to filehandling");
                       
                       sw.Close();
                       fs.Close();
                       Console.WriteLine("File creation of" + path + "is done successfully");
                   }
                   else if (File.Exists(path)&&locking==false)
                   {
                       Console.WriteLine("file already exists");
                   }
                      
               }
            }
           public static volatile bool locking = true;
           
            public void FileReading()
              {  
                   if (File.Exists(path)&&locking)
                   {
                       lock(this)
                       {
                       FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
                       StreamReader sr = new StreamReader(fs);

                       string s = sr.ReadToEnd();

                       Console.WriteLine(s);
                       sr.Close();
                       fs.Close();
                       }
                      
                   }
                   else if(!File.Exists(path)&&locking==false)
                       Console.WriteLine("file doent exists");
               }

Matt T Heffron

Непонятно, чего вы пытаетесь достичь.
Как показано, нет никакого смысла использовать потоки вообще, так как как только вы начинаете каждый поток, Join() блокируется до тех пор, пока поток не завершится. Так что все это просто можно было бы выполнить прямо в Main ().
Демо-класс имеет флаг блокировки, который также ничего не делает, так как он истинен, и нет ничего, что изменило бы это.
Кроме того, считается очень плохой идеей, чтобы экземпляр класса сам блокировал (). Лучше всего, чтобы экземпляр класса имел закрытое поле типа object, инициализированное фиктивным объектом, который будет использоваться для блокировки доступа к операциям в классе.

Пожалуйста, используйте" вопрос об улучшении " выше и уточните, что вы действительно пытаетесь сделать.

Member 12821006

для синхронизации я поставил блокировку их.

1 Ответов

Рейтинг:
0

Patrice T

У вас есть вопрос ?

Цитата:
Я создал два потока для двух методов filewriting и filereading. При использовании синхронизации только один поток должен получить доступ либо к записи файлов, либо к чтению файлов.
Гарантируя, что оба потока являются взаимоисключающими, вы уничтожаете цель потоков. В чем заключается интерес ?
просто создание 2 подпрограмм и вызов их по очереди сделали бы эту работу.