Работа с потоками: минимизировать работу с файлом внутри блокировки - C#

Узнай цену своей работы

Формулировка задачи:

есть программа с потоками, которая выводит с помощью двух потоков имена. с привязкой со временем. вот .
using System;
using System.IO;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication123
{
    public class InnerClassTest
    {
        public static void Main(String[] args)
        {
 
            TalkingClock clock = new TalkingClock(3000, true, "Alex");
            TalkingClock clock2 = new TalkingClock(5000, true, "Petr");
            clock.Start();
            //clock.join();
            clock2.Start();
 
            Console.ReadLine();
        }
    }
 
    class TalkingClock
    {
        private Timer t;
        private TimerPrinter listener;
 
        public TalkingClock(int interval, Boolean beep, String name)
        {
            this.interval = interval;
            this.beep = beep;
            this.name = name;
        }
 
        public void Start()
        {
            listener = new TimerPrinter();
            t = new Timer(new TimerCallback(listener.CheckStatus), this, 0, interval);
        }
 
        void OnTick()
        {
        }
 
        private int interval;
        private Boolean beep;
        public String name;
    }
    class TimerPrinter
    {
        static object fileLocker = new object();
 
        // This method is called by the timer delegate. 
        public void CheckStatus(Object stateInfo)
        {
            try
            {
                lock (fileLocker)//лок для предотвращения одновременной записи в файл разными потоками
                {
                    DateTime now = DateTime.Now;
                    String str = now.ToString();
                    
                    TalkingClock sender = stateInfo as TalkingClock;
                    sender.name = sender.name + "\r\n";
                    using (StreamWriter sw = new StreamWriter(File.Open("D:\\Variables.txt", FileMode.Append, FileAccess.Write)))
                      
                       sw.WriteLine(sender.name + str);
                }
            }
            catch (FileNotFoundException e)
            {
                Console.WriteLine(" не найден файл ");
            }
            catch (IOException e)
            {
                Console.WriteLine(" дргуая ошибка на ввод - вывод ");
            }
        }
    }
}
мне надо минимизировать работу с файлом внутри блокировки. . как мне подсказали , надо 1. создать sw в методе main 2. передать его параметром в конструктор TalkingClock 3. В новом потоке обратится к нему из TimerPrrinter. как 3 реализовать.?
using System;
using System.IO;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication123
{
    public class InnerClassTest
    {
        public static void Main(String[] args)
        {
            StreamWriter sw = new StreamWriter(File.Open("D:\\Variables.txt", FileMode.Append, FileAccess.Write);
            TalkingClock clock = new TalkingClock(3000, true, "Alex",sw);
            TalkingClock clock2 = new TalkingClock(5000, true, "Petr",sw);
            clock.Start();
            //clock.join();
            clock2.Start();
 
            Console.ReadLine();
        }
    }
 
    class TalkingClock
    {
        private Timer t;
        private TimerPrinter listener;
 
        public TalkingClock(int interval, Boolean beep, String name, StreamWriter sw)
        {
            this.interval = interval;
            this.beep = beep;
            this.name = name;
            this.sw = sw;
        }
 
        public void Start()
        {
            listener = new TimerPrinter();
            t = new Timer(new TimerCallback(listener.CheckStatus), this, 0, interval);
        }
 
        void OnTick()
        {
        }
 
        private int interval;
        private Boolean beep;
        public String name;
        public StreamWriter sw;
    }
    class TimerPrinter
    {
        static object fileLocker = new object();
 
        // This method is called by the timer delegate. 
        public void CheckStatus(Object stateInfo)
        {
            try
            {
                lock (sw)//лок для предотвращения одновременной записи в файл разными потоками
                {
                    DateTime now = DateTime.Now;
                    String str = now.ToString();
                    
                    TalkingClock sender = stateInfo as TalkingClock;
                    sender.name = sender.name + "\r\n";

                       sw.WriteLine(sender.name + str);
                
            }
            catch (FileNotFoundException e)
            {
                Console.WriteLine(" не найден файл ");
            }
            catch (IOException e)
            {
                Console.WriteLine(" дргуая ошибка на ввод - вывод ");
            }
        }
    }
}

Решение задачи: «Работа с потоками: минимизировать работу с файлом внутри блокировки»

textual
Листинг программы
var str = now.ToString() + "\r\n" + sender.name;
 
sw.WriteLine(str);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.727 из 5
Похожие ответы