S
spbsmile
Код:
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(" другая ошибка на ввод - вывод ");
}
}
}
}
Вся работа с файлом внутри блокировки. Этот раздел надо минимизировать.
?? как вынести запись файла за блокировку?? что я тогда буду блокировать ??