我有一个系统文件观察器,允许用户查看实时日志文件。其中一些日志文件可能会变得非常大,并且有时会通过VPN读取它们,从而进一步减慢了该过程。有没有办法优化我的更改事件?我已经得到了它,以便它可以工作,并显示信息,并且不会复制或显示过去的事件,但我在表单上的按钮也会锁定。所以我的第一个问题是如何进一步优化我的代码?我的第二个问题是我如何仍然与我的表单交互?
private void fileWatcher_Changed(object sender, FileSystemEventArgs e)
{
fileWatcher.EnableRaisingEvents = false;
var fs = new FileStream(GlobalVar.GlobalString, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
using (var sr = new StreamReader(fs))
{
var s = "";
int copyGood = 0;
bool result = false;
bool copyModeOn = false;
var newDateTime = new DateTime();
List<string> list = new List<string>();
if (GlobalVar.GlobalLineCount > 0)
{
for (var i = 0; i < GlobalVar.GlobalLineCount; i++)
{
sr.ReadLine();
}
while ((s = sr.ReadLine()) != null)
{
list.Add(s);
}
}
else
{
while ((s = sr.ReadLine()) != null)
{
list.Add(s);
}
}
GlobalVar.GlobalLineCount = list.Count();
list.Reverse();
var list2 = list.Take(50).Reverse().ToList();
foreach (string s1 in list2)
{
if (s1.Length > 23)
{
var lineTime = s1.Substring(0, 23);
result = DateTime.TryParse(lineTime, out newDateTime);
}
if (newDateTime != null && result)
{
DateTime lineTime = Convert.ToDateTime(newDateTime.ToString(@"HH:mm:ss.fff"));
DateTime dt = Convert.ToDateTime(GlobalVar.GlobalDateTimeString);
DateTime globalTimeSet = Convert.ToDateTime(dt.ToString(@"HH:mm:ss.fff"));
copyGood = DateTime.Compare(globalTimeSet, lineTime);
}
if (result && copyGood < 0)
{
if (richTextBox1.Lines.Length > 0)
{
foreach (string line in richTextBox1.Lines)
{
if (line == s1)
{
copyModeOn = false;
break;
}
copyModeOn = true;
}
}
else
{
copyModeOn = true;
}
if (copyModeOn)
{
richTextBox1.AppendText(Environment.NewLine + s1 );
richTextBox1.Focus();
richTextBox1.Select(richTextBox1.TextLength, 0);
richTextBox1.ScrollToCaret();
}
}
}
}
fileWatcher.EnableRaisingEvents = true;
}`
您能提供的任何帮助将不胜感激!
不是真的。最大的好处是中间没有远程网络连接 - 这意味着将大部分处理转移到应用程序服务器,并且只通过网络发送所需的线路。
你要做的不是读取整个文件。显然,日志文件条目的大小有限。没有必要一遍又一遍地从最后开始;)您可以假设每行的最大大小(假设 512 字节),仅此一项就会减少大量大文件的读取。或者您实际上可以记住上次读取的位置。