对不起,大量的代码,我不能解释与less.Basically我试图从许多任务写入文件。 你们能告诉我我做错了什么吗? _streamWriter.WriteLine()
会抛出ArgumentOutOfRangeException
。Streamwriter,StringBuilder和并行循环
class Program
{
private static LogBuilder _log = new LogBuilder();
static void Main(string[] args)
{
var acts = new List<Func<string>>();
var rnd = new Random();
for (int i = 0; i < 10000; i++)
{
acts.Add(() =>
{
var delay = rnd.Next(300);
Thread.Sleep(delay);
return "act that that lasted "+delay;
});
}
Parallel.ForEach(acts, act =>
{
_log.Log.AppendLine(act.Invoke());
_log.Write();
});
}
}
public class LogBuilder : IDisposable
{
public StringBuilder Log = new StringBuilder();
private FileStream _fileStream;
private StreamWriter _streamWriter;
public LogBuilder()
{
_fileStream = new FileStream("log.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
_streamWriter = new StreamWriter(_fileStream) { AutoFlush = true };
}
public void Write()
{
lock (Log)
{
if (Log.Length <= 0) return;
_streamWriter.WriteLine(Log.ToString()); //throws here. Although Log.Length is greater than zero
Log.Clear();
}
}
public void Dispose()
{
_streamWriter.Close(); _streamWriter.Dispose(); _fileStream.Close(); fileStream.Dispose();
}
}
你有一个堆栈跟踪?我没有看到'Streamwriter.WriteLine(object)'抛出异常http://msdn.microsoft.com/en-us/library/4zcc928k.aspx。 (奇怪的是MSDN在来自StreamWriter时指向TextWriter) – Prescott 2012-02-17 16:19:28
哦..也许这是StringBuilder的责任? http://msdn.microsoft.com/en-us/library/system.text.stringbuilder(v=VS.100).aspx – Agzam 2012-02-17 16:34:09
嗯..它似乎是这样...我用“for”替换Log.ToString() “循环,它的工作.. – Agzam 2012-02-17 16:36:18