首先,StreamWriter线程安全么?
答:StreamWriter 的构造以及StreamWriter.WriteLine(string)都是非线程安全的
我们封装两个写日志的方法。
底层都是由StreamWriter.writeline来实现.一个加锁,一个不加锁。将加锁的那个命名为safewritelog,另一个命名为unsafeWritelog.然后利用两个循环。不停的分别创建个线程,去写日志。测试看哪个会出现写异常。代码如下:
namespace ThreadWriteLog
{
class Program
{
private static object ob = "哟内容!!";
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
Thread wrtieThread = new Thread(SafyWriteLog);
wrtieThread.Name = "线程--" + i;
string content = "这是" + wrtieThread.Name + "的内容Y";
wrtieThread.Start(content);
}
for (int i = 0; i < 10; i++)
{
Thread wrtieThread = new Thread(UnSafyWriteLog);
wrtieThread.Name = "线程¨¬--" + i;
string content = "这是" + wrtieThread.Name + "的内容Y";
wrtieThread.Start(content);
}
Console.WriteLine("结束");
Console.Read();
}
public static void SafyWriteLog(object content)
{
string path = @"C:\SafeLog.txt";
lock (ob)
{
StreamWriter sw = File.AppendText(path);
sw.WriteLine(content.ToString());
sw.Close();
}
}
public static void UnSafyWriteLog(object content)
{
string path = @"C:\UnSafeLog.txt";
StreamWriter sw = File.AppendText(path);
sw.WriteLine(content.ToString());
sw.Close();
}
}
}
运行后,第一个for循环顺利结束,文件中显示 0-9进程没有问题。
这是线程--0的内容
这是线程--1的内容
这是线程--2的内容
这是线程--5的内容
这是线程--3的内容
这是线程--4的内容
这是线程--6的内容
这是线程--7的内容
这是线程--8的内容
这是线程--9的内容
也符合线程的概念,随着系统的随

本文探讨了C#中StreamWriter.WriteLine在多线程环境下的线程安全性问题。通过实验发现,StreamWriter的构造是非线程安全的,而同一个StreamWriter实例的WriteLine方法在特定情况下可能导致线程不安全,主要原因是I/O争用。加锁可以确保线程安全,但会影响效率。文章留下悬念,将在后续篇章中继续深入研究。
&spm=1001.2101.3001.5002&articleId=6789810&d=1&t=3&u=f40c65cd30044d57bafed60ca7496c44)
244

被折叠的 条评论
为什么被折叠?



