Работа с потоками: минимизировать работу с файлом внутри блокировки - 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);