【发布时间】:2012-02-17 16:11:01
【问题描述】:
抱歉,代码量很大,我无法用 less 来解释这一点。基本上我正在尝试从许多任务中写入文件。
你们能告诉我我做错了什么吗? _streamWriter.WriteLine() 抛出 ArgumentOutOfRangeException。
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)抛出异常msdn.microsoft.com/en-us/library/4zcc928k.aspx。 (奇怪的是,当来自 StreamWriter 时,MSDN 指向 TextWriter) -
哦.. 也许是 StringBuilder 的错? msdn.microsoft.com/en-us/library/…
-
yup.. 似乎是这样...我用“for”循环替换了 Log.ToString() 并且它起作用了..
标签: multithreading c#-4.0 task task-parallel-library parallel-processing