C# 如何使用StreamWriter避免竞争条件
根据:,“默认情况下,StreamWriter不是线程安全的。请参阅TextWriter.Synchronized以获取线程安全包装器。”因此,我编写了一个方法并使用TextWriter.Synchronized来同步我的StreamWriter对象:C# 如何使用StreamWriter避免竞争条件,c#,.net,race-condition,C#,.net,Race Condition,根据:,“默认情况下,StreamWriter不是线程安全的。请参阅TextWriter.Synchronized以获取线程安全包装器。”因此,我编写了一个方法并使用TextWriter.Synchronized来同步我的StreamWriter对象: static void GenerateData() { string fileName = Path.Combine(directory, "filenames.txt"); using
static void GenerateData()
{
string fileName = Path.Combine(directory, "filenames.txt");
using(StreamWriter names = new StreamWriter(fileName))
{
// Synchronize access to names
TextWriter.Synchronized(names);
// Create 100,000 test files
// Take advantage of parallelism
Parallel.For(0, 100001, i =>
{
// Generate name of test file
string curFile = Path.Combine(directory, String.Format("test{0}.txt", i + 1));
// Store test file name in filenames.txt
names.WriteLine(curFile);
using(StreamWriter writer = new StreamWriter(curFile))
{
// Take advantage of multiple cores
//TextWriter.Synchronized(writer);
// For 30 lines ..
for(int j = 0; j < 30; j++)
{
List<Rule> rules = new List<Rule>();
// .. generate i rules
for(int k = 0; k < i; k++)
{
// Name of rule starts with r followed by random number in range [0, 9999]
string name = "r" + String.Format("{0}", random.Next(0, 10000));
// Rule priority is in range [0, 500]
int pty = random.Next(1, 501);
rules.Add(new Rule(name, pty));
}
// Write the list of rules to curFile
writer.WriteLine(String.Join(", ", rules.ToArray()));
};
}
});
}
}
static void GenerateData()
{
字符串文件名=Path.Combine(目录,“filenames.txt”);
使用(StreamWriter名称=新StreamWriter(文件名))
{
//同步对名称的访问
TextWriter.Synchronized(名称);
//创建100000个测试文件
//利用并行性
对于(0,100001,i=>
{
//生成测试文件的名称
string curFile=Path.Combine(目录,string.Format(“test{0}.txt”,i+1));
//将测试文件名存储在filenames.txt中
name.WriteLine(curFile);
使用(StreamWriter=新StreamWriter(curFile))
{
//利用多核
//TextWriter.Synchronized(writer);
//30行。。
对于(int j=0;j<30;j++)
{
列表规则=新列表();
//…生成i规则
对于(int k=0;k
然而,尽管如此,输出文件(filenames.txt)中的一些行仍然与其他行混淆。我想知道是否可以在不使用StreamWriter上的锁的情况下修复此问题
样本输出:
像这样使用返回的
TextWriter
:
var syncWriter = TextWriter.Synchronized(names);
MSDN()表示:
对返回包装的所有写入操作都是线程安全的。你
调用此方法以确保一次只能执行一个线程
返回的TextWriter实例上的方法
Synchronized()?在编写filenames.txt
之后,您能给我们看一下它的内容吗?这样我们就知道您的意思了。@ConstantCoder我已经添加了几行输出内容