如何多次打开带有 logfil 的程序? (C#)
How can I open a Program with a logfil multiple times? (C#)
我有这个代码:
class Program
{
static void Main(string[] args)
{
using (StreamWriter w = File.AppendText(@"C:\temp\log.txt"))
{
Log("Test1", w);
Console.ReadLine();
}
}
public static void Log(string logMessage, TextWriter w)
{
w.WriteLine(DateTime.Now.ToShortDateString() + " | " + DateTime.Now.ToLongTimeString());
w.WriteLine(logMessage);
w.WriteLine("-----------------------------------------------------------------------");
}
}
当我同时启动此代码两次时,出现异常,因为该文件已在另一个实例中打开。
有没有 "StreamWriter" 的替代方案可以从两个实例写入同一个文件?
实际上 StramWriter 需要在写入内容后关闭文件处理程序。因此,通过放置 Using 语句,您将此任务(关闭文件处理程序)交给了 Using
(这是它的好处之一),所以如果您在 Using
中等待出于任何原因阻止(您添加了 Console.ReadLine())文件处理程序将打开直到该块结束。
如果以上代码正确:
class Program
{
static void Main(string[] args)
{
using (StreamWriter w = File.AppendText(@"C:\temp\log.txt"))
{
Log("Test1", w);
}
Console.ReadLine();
}
public static void Log(string logMessage, TextWriter w)
{
w.WriteLine(DateTime.Now.ToShortDateString() + " | " + DateTime.Now.ToLongTimeString());
w.WriteLine(logMessage);
w.WriteLine("-----------------------------------------------------------------------");
}
}
应该有很小的并发几率。但它可能会发生,您可以使用 try catch 块和 while 语句来确保您的日志已提交。
class Program
{
static void Main(string[] args)
{
bool WriteDone = false;
while(!WriteDone)
{
try
{
using (StreamWriter w = File.AppendText(@"C:\temp\log.txt"))
{
Log("Test1", w);
}
WriteDone = true;
}
catch
{
System.Threading.Thread.Sleep(1000); // Wait for 1s and try again
}
}
Console.ReadLine();
}
public static void Log(string logMessage, TextWriter w)
{
w.WriteLine(DateTime.Now.ToShortDateString() + " | " + DateTime.Now.ToLongTimeString());
w.WriteLine(logMessage);
w.WriteLine("-----------------------------------------------------------------------");
}
}
我有这个代码:
class Program
{
static void Main(string[] args)
{
using (StreamWriter w = File.AppendText(@"C:\temp\log.txt"))
{
Log("Test1", w);
Console.ReadLine();
}
}
public static void Log(string logMessage, TextWriter w)
{
w.WriteLine(DateTime.Now.ToShortDateString() + " | " + DateTime.Now.ToLongTimeString());
w.WriteLine(logMessage);
w.WriteLine("-----------------------------------------------------------------------");
}
}
当我同时启动此代码两次时,出现异常,因为该文件已在另一个实例中打开。
有没有 "StreamWriter" 的替代方案可以从两个实例写入同一个文件?
实际上 StramWriter 需要在写入内容后关闭文件处理程序。因此,通过放置 Using 语句,您将此任务(关闭文件处理程序)交给了 Using
(这是它的好处之一),所以如果您在 Using
中等待出于任何原因阻止(您添加了 Console.ReadLine())文件处理程序将打开直到该块结束。
如果以上代码正确:
class Program
{
static void Main(string[] args)
{
using (StreamWriter w = File.AppendText(@"C:\temp\log.txt"))
{
Log("Test1", w);
}
Console.ReadLine();
}
public static void Log(string logMessage, TextWriter w)
{
w.WriteLine(DateTime.Now.ToShortDateString() + " | " + DateTime.Now.ToLongTimeString());
w.WriteLine(logMessage);
w.WriteLine("-----------------------------------------------------------------------");
}
}
应该有很小的并发几率。但它可能会发生,您可以使用 try catch 块和 while 语句来确保您的日志已提交。
class Program
{
static void Main(string[] args)
{
bool WriteDone = false;
while(!WriteDone)
{
try
{
using (StreamWriter w = File.AppendText(@"C:\temp\log.txt"))
{
Log("Test1", w);
}
WriteDone = true;
}
catch
{
System.Threading.Thread.Sleep(1000); // Wait for 1s and try again
}
}
Console.ReadLine();
}
public static void Log(string logMessage, TextWriter w)
{
w.WriteLine(DateTime.Now.ToShortDateString() + " | " + DateTime.Now.ToLongTimeString());
w.WriteLine(logMessage);
w.WriteLine("-----------------------------------------------------------------------");
}
}