初始化的FileStream和StreamWriter领域中的服务类(Initializing Fi

2019-07-31 03:46发布

我提出的方法以外的代码,因为我需要关闭和处置的StreamWriter和FILESTREAM在调用OnStop()方法:

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提示错误“A字段初始不能引用非静态字段,方法或属性..”。 所以我做了静态的FileStream:

private static FileStream fs = new FileStream(@"D:\Hello.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite);

当我运行程序时,它不会写入文本文件,并得出结论认为,这是静态的,因为。 我搜索一下,读这个 :“A类可以声明为static,这表明它仅包含静态成员是无法创建使用new关键字静态类的实例的静态类由.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();
    }
}

你觉得我应该怎么办?

Answer 1:

您所做的一切应该可以正常工作,但它不这样做的好方法,所以它不是值得探讨,为什么它不工作。 在一个类中有静态变量不会使类的静态。

只是声明变量没有initialisers,然后设置变量的时候,你要打开的文件:

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


Answer 2:

不要让他们一成不变的。 刚刚从外地初始化,初始化代码移到构造函数。 而且不要忘记加上Dispose是处置它们的方法。



Answer 3:

你并不需要一个静态字段,只要将初始化构造函数:

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()方法。



文章来源: Initializing FileStream and StreamWriter fields in a service class
标签: c# static