OnStop() メソッドで streamwriter と filestream を閉じて破棄する必要があるため、このコードをメソッドの外に作成しました。
private Timer timer = new Timer();
private FileStream fs = new FileStream(@"D:\Hello.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
private StreamWriter sw = new StreamWriter(fs);
//The fs is in red line, having error
ただし、新しい StreamWriter 内の fs は、「フィールド初期化子は非静的フィールド、メソッド、またはプロパティを参照できません..」というエラーを表示します。だから私は FileStream を静的にしました:
private static FileStream fs = new FileStream(@"D:\Hello.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
プログラムを実行すると、テキストファイルに書き込まれず、静的が原因であると結論付けました。私はそれについて検索して、これを読みました:「クラスは静的であると宣言できます。これは、静的メンバーのみが含まれていることを示します。新しいキーワードを使用して静的クラスのインスタンスを作成することはできません。静的クラスは、.NET Framework によって自動的に読み込まれます。クラスを含むプログラムまたは名前空間が読み込まれると、共通言語ランタイム (CLR) が読み込まれます。」
これは私のサンプルコードです:
public partial class Service1 : ServiceBase
{
private Timer timer = new Timer();
private FileStream fs = new FileStream(@"D:\Hello.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
private StreamWriter sw = new StreamWriter(fs);
//The fs is in red line, having error. Look in my description for error's details
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
timer.Elapsed += new ElapsedEventHandler(WriteText);
timer.Interval = 5000; //5 seconds
timer.Start();
}
public void WriteText(object source, ElapsedEventArgs e)
{
sw.WriteLine(DateTime.Now + " Windows Service");
}
protected override void OnStop()
{
sw.Close();
sw.Dispose();
fs.Close();
fs.Dispose();
timer.Stop();
}
}
どうすればいいと思いますか?