我制作了Logger,它记录了一个字符串,一个静态的静态类 所以我可以从我的整个项目中调用它,而不必创建它的实例。 非常好,但我想让它在一个单独的线程中运行,因为访问文件需要花费时间
可能是某种方式,最好的方法是什么?
这是一个简短的描述,但我希望这个想法很清楚。如果没有,请告诉我。
提前致谢!
顺便说一句,对我的代码的任何其他改进也是受欢迎的,我觉得并不是所有东西都尽可能高效:
internal static class MainLogger
{
internal static void LogStringToFile(string logText)
{
DateTime timestamp = DateTime.Now;
string str = timestamp.ToString("dd-MM-yy HH:mm:ss ", CultureInfo.InvariantCulture) + "\t" + logText + "\n";
const string filename = Constants.LOG_FILENAME;
FileInfo fileInfo = new FileInfo(filename);
if (fileInfo.Exists)
{
if (fileInfo.Length > Constants.LOG_FILESIZE)
{
File.Create(filename).Dispose();
}
}
else
{
File.Create(filename).Dispose();
}
int i = 0;
while(true)
{
try
{
using (StreamWriter writer = File.AppendText(filename))
{
writer.WriteLine(str);
}
break;
}
catch (IOException)
{
Thread.Sleep(10);
i++;
if (i >= 8)
{
throw new IOException("Log file \"" + Constants.LOG_FILENAME + "\" not accessible after 5 tries");
}
}
}
}
}
enter code here
答案 0 :(得分:3)
答案 1 :(得分:3)
如果您将此作为练习(仅使用现成的记录器不是一种选择),您可以尝试生产者/消费者系统。
Init
函数,或使用静态构造函数 - 在其中,启动一个新的System.Threading.Thread
,它只运行while(true)
循环。Queue<string>
并将您的日志记录功能排入其中。while(true)
循环查找队列中的项目,将它们出列并记录它们。答案 2 :(得分:1)
好的,只需要创建一个ThreadSafe静态类。下面是一些代码片段,一个你从任何线程调用的委托,这指向正确的线程,然后调用WriteToFile函数。
当您启动要记录的应用程序时,请传递以下内容,其中LogFile是日志文件的文件名和路径。
Log.OnNewLogEntry += Log.WriteToFile (LogFile, Program.AppName);
然后你想把它放在你的静态日志类中。向导位是ThreadSafeAddEntry函数,这将确保您使用正确的线程来写入代码行。
public delegate void AddEntryDelegate(string entry, bool error);
public static Form mainwin;
public static event AddEntryDelegate OnNewLogEntry;
public static void AddEntry(string entry) {
ThreadSafeAddEntry( entry, false );
}
private static void ThreadSafeAddEntry (string entry, bool error)
{
try
{
if (mainwin != null && mainwin.InvokeRequired) // we are in a different thread to the main window
mainwin.Invoke (new AddEntryDelegate (ThreadSafeAddEntry), new object [] { entry, error }); // call self from main thread
else
OnNewLogEntry (entry, error);
}
catch { }
}
public static AddEntryDelegate WriteToFile(string filename, string appName) {
//Do your WriteToFile work here
}
}
最后写一条线......
Log.AddEntry ("Hello World!");
答案 3 :(得分:0)
在这种情况下,您拥有的是典型的生产者消费者场景 - 许多线程生成日志条目,一个线程将它们写入文件。 MSDN有一个article with sample code for this scenario。
答案 4 :(得分:0)
对于初学者,您的日志记录机制通常应该避免抛出异常。经常记录机制是写入错误的地方,因此当它们也开始出错时会变得很难看。
我会调查BackgroundWorker类,因为它允许你分叉可以为你做日志记录的线程。这样你的应用程序就不会变慢,所引发的任何异常都会被忽略。