Минимизация

  • Автор темы spbsmile
  • Дата начала
S

spbsmile

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

?? как вынести запись файла за блокировку?? что я тогда буду блокировать ??
 

LuMee

Well-known member
02.05.2006
477
0
#2
Полагаю, вполне достаточно будет оставить внутри lock-блока только саму запись, все остальное (что идет до using(StreamWriter...)) надо вынести.
Да, вот эта строчка:
Код:
sender.name = sender.name + "\r\n";
мне не нравится категорически.