StreamWrite WriteLine不能作为委托工作

时间:2018-07-11 17:13:01

标签: c# .net lambda delegates streamwriter

我想创建一个简单的记录器,为此,我以这种方式使用委托:

delegate void Logger(string message);

但是当我尝试使用下面的方法创建一个Logger时,这并没有在文件中添加任何内容。

Logger CreateFileLogger(string filePath) {
            if (!File.Exists(filePath)) File.Create(filePath);
            StreamWriter stream = File.AppendText(filePath);
            return stream.WriteLine;
        }

无论如何我都不敢肯定地说这是StreamWriter类的问题还是委托的问题。

谢谢。

3 个答案:

答案 0 :(得分:3)

您永远不会丢弃该流,并且永远不会刷新该流(因为您没有足够的写入),因此什么也不会写入该文件。您不应该泄漏这样的一次性资源。

幸运的是,根本不需要处理流。只需使用File.AppendAllText即可,而不要自己创建流并对其进行管理。

答案 1 :(得分:1)

问题在于它正在写入StreamWriter-但是您永远不会关闭该StreamWriter,因此不会被刷新,您也会使文件句柄保持打开状态-不好。

如果确定执行刷新并关闭文件,则可以:

using System;
using System.IO;

class Test
{
    static void Main()
    {
        using (var writer = new StreamWriter("test.txt"))
        {
            Action<string> logger = writer.WriteLine;
            ExecuteDelegate(logger);
        }
    }

    static void ExecuteDelegate(Action<string> logger)
    {
         logger("First line");
         logger("Second line");
         logger("Third line");
    }
}

答案 2 :(得分:0)

您可以尝试将WriteLine包装在另一个动作中,例如:

Logger CreateFileLogger(string filePath) {
    if (!File.Exists(filePath)) File.Create(filePath);
        StreamWriter stream = File.AppendText(filePath);
        return (str) => { stream.WriteLine(str); stream.Flush(); };
}

但是如上所述,流从未关闭。希望对您有所帮助。