我有一个收集字符串的类。有一个方法Commit,它将字符串写入目标文件。
如果收集了一个字符串,但从未调用过提交,我想将错误报告给日志文件。
IDisposable
无法解决问题,因为家属会忘记调用它
我实现了终结器,但遇到了编译器错误:
该课程中有一个终结者 考虑从IDisposable,CriticalFinalizerObject或SafeHandle派生而来。
我无法更改公司的编译器设置。并且,建议的选项似乎过于复杂。我是如何实现Commit的验证的?
答案 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);
}