Работа с потоками: минимизировать работу с файлом внутри блокировки - C#
Формулировка задачи:
есть программа с потоками,
которая выводит с помощью двух потоков имена. с привязкой со временем.
вот .
мне надо минимизировать работу с файлом внутри блокировки.
.
как мне подсказали , надо
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) { 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(" дргуая ошибка на ввод - вывод "); } } } }
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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д