根据:https://msdn.microsoft.com/en-us/library/system.io.streamwriter%28v=vs.110%29.aspx,“默认情况下,StreamWriter不是线程安全的,请参阅TextWriter.Synchronized for thread-safe wrapper。”所以我写了一个方法,并用于TextWriter.Synchronized同步我的StreamWriter对象:如何使用StreamWriter避免竞争条件
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()));
};
}
});
}
}
但是尽管这样,在输出文件(filenames.txt)一些行仍然可以得到错杂与他人。我想知道这是否可以修复而不诉诸在StreamWriter锁。
示例输出:
- C:\ Users \用户弗兰克·\文件\视觉工作室2013 \项目\ TimedAssignment3 \ TimedAssignment3 \数据集\ test1.txt的
- C:\ Users \用户弗兰克·\文件\视觉studio 2013 \ Projects \ TimedAssignment3 \ TimedAssignment3 \ Datasets \ test50001.txt
- C:\ Users \ Frank \ Documents \ visual studio 2013 \ Projects \ TimedAssignment3 \ TimedAssignment3 \ Datasets \ tesal studio 2013 \ Projects \ TimedAssignment3 \ TimedAssignment3 \ Datasets \ test37501.txt
- C:\ Users \ Frank \ Documents \ visual studio 2013 \ Projects \ TimedAssignment3 \ TimedAssignment3 \ Datasets \ test87501.txt
- C:\ Users \ Frank \ Documents \ visual studio 2013 \ Projects \ TimedAssignment3 \ TimedAssignment3 \ Datasets \ test12501.txt
“混乱”是什么意思?你可以在写完文件后向我们显示'filenames.txt'的内容,所以我们知道你的意思吗? – reduckted 2015-04-05 05:17:21
@ConstantCoder我已经添加了几行输出 – 2015-04-05 06:00:16