C#:如何确保课程完成工作,而不依赖家属?

时间:2017-01-24 07:13:48

标签: c# idisposable finalizer

我有一个收集字符串的类。有一个方法Commit,它将字符串写入目标文件。

如果收集了一个字符串,但从未调用过提交,我想将错误报告给日志文件。

IDisposable无法解决问题,因为家属会忘记调用它 我实现了终结器,但遇到了编译器错误:

  

该课程中有一个终结者   考虑从IDisposable,CriticalFinalizerObject或SafeHandle派生而来。

我无法更改公司的编译器设置。并且,建议的选项似乎过于复杂。我是如何实现Commit的验证的?

2 个答案:

答案 0 :(得分:1)

从你的问题来看,这听起来像是这样的:

免责声明,这只是记事本中编写得不​​好的代码,未经过测试。

class CollectAndCommit : IDisposable
{
    private Dictionary<string, bool> collectedStrings { get; set; }

    public CollectAndCommit()
    {
        collectedStrings = new Dictionary<string, bool>();
    }

    public void Collect(string collectedString)
    {
        collectedStrings.Add(collectedString, false);
    }

    public void CommitAllUncommitedStrings()
    {
        foreach (var uncommitedString in collectedStrings.Where(c => c.Value == false))
        {
            collectedStrings[uncommitedString.Key] = Commit(uncommitedString.Key);
        }
    }

    public bool HasUncommitedStrings()
    {
        return collectedStrings.Count(c => c.Value == false) > 0;
    }

    private bool Commit(string str)
    {
        try
        {
            string path = @"c:\temp\MyTest.txt";
            if (!File.Exists(path))
            {
                File.Create(path);
            }

            using (StreamWriter sw = File.AppendText(path))
            {
                sw.WriteLine(str);
            }   
            return true;
        }
        catch 
        {
            return false;
        }
    }

    public void Dispose()
    {
        if (HasUncommitedStrings())
        {
            throw new Exception("Uncommited Strings!");
        }
    }
}

答案 1 :(得分:-1)

  

我有一个收集字符串的类。有一个方法Commit,即   将字符串写入目标文件。

据我了解这个问题,你被长时间的字符串读取所困扰,没有调用Commit(字符串s) - 可能有很多原因,比如内存很小(所以在Load中没有整个字符串适合内存)或者您正在阅读一些连续的流,......

现在它取决于程序失败的地方

是否会抛出异常? &GT; 使用try-catch / re-throw错误。

不停止读取吗? &GT; 给予它阅读的时间限制,一旦超支,抛出错误或只是返回你所拥有的&amp;提交。

public class MyClass
{

    StringBuilder SB;

    public string ObtainString()
    {
        // This is executed, but takes lot of time/times out
        // Possible solution below

        SB = new StringBuilder();
        DateTime dt = DateTime.Now;
        bool isRead = false;

        while(DateTime.Now.Add(20) > dt) && !isRead)
        {
            string helpVar = ReadPartOfFileOrBuffer();
            SB.Append(helpVar);

            isRead = checkIfFileOrBufferIsRead();
        };

        if(!isRead) throw new Exception("Read timed out");

        return SB.ToString();
    }

    public voic Commit(string s)
    {
        //This is not being executed!
    }

    public void Do()
    {
        string result = ObtainString();
        Commit(result);
    }