2

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();
    }
}

どうすればいいと思いますか?

4

3 に答える 3

4

あなたが行ったことはうまくいくはずですが、それは良い方法ではないので、なぜうまくいかないのかを調査する価値はありません。クラスに静的変数があっても、クラスは静的になりません。

初期化子なしで変数を宣言するだけで、ファイルを開くときに変数を設定できます。

public partial class Service1 : ServiceBase
{
    private Timer timer;
    private FileStream fs;
    private StreamWriter sw

    public Service1()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        fs = new FileStream(@"D:\Hello.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
        sw = new StreamWriter(fs);
        timer = new Timer();
        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()
    {
        timer.Stop(); // Stop the timer before closing the file
        sw.Close();
        sw.Dispose();
        fs.Close();
        fs.Dispose();
    }
}
于 2012-08-24T08:21:27.630 に答える
3

それらを静的にしないでください。初期化コードをフィールド初期化子からコンストラクターに移動するだけです。Disposeそれらを破棄するメソッドを追加することを忘れないでください。

于 2012-08-24T08:18:00.560 に答える
2

静的フィールドは必要ありません。初期化をコンストラクターに移動するだけです。

private FileStream fs;
private StreamWriter sw;

public MyClass()
{
    fs = new FileStream(@"D:\Hello.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite); 
    sw = new StreamWriter(fs);
}

OnStop()メソッドが実際に呼び出され、ストリームが破棄されていることを確認するにIDisposableは、クラスに実装し、メソッドOnStop()の最後で呼び出しますDispose()

于 2012-08-24T08:19:10.250 に答える