對不起,大量的代碼,我不能解釋與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