【发布时间】:2014-05-07 15:38:48
【问题描述】:
将Stringbuilder 异步写入文件。此代码控制一个文件,向其中写入一个流并释放它。它处理来自异步操作的请求,这些请求可能随时进来。
FilePath 是针对每个类实例设置的(因此锁定 Object 是针对每个实例的),但由于这些类可能共享 FilePaths,因此存在潜在的冲突。这种冲突,以及来自类实例之外的所有其他类型,都将通过重试来处理。
此代码是否适合其用途?有没有更好的方法来处理这个问题,这意味着更少(或不)依赖捕获和重试机制?
还有我如何避免捕获因其他原因而发生的异常。
public string Filepath { get; set; }
private Object locker = new Object();
public async Task WriteToFile(StringBuilder text)
{
int timeOut = 100;
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
while (true)
{
try
{
//Wait for resource to be free
lock (locker)
{
using (FileStream file = new FileStream(Filepath, FileMode.Append, FileAccess.Write, FileShare.Read))
using (StreamWriter writer = new StreamWriter(file, Encoding.Unicode))
{
writer.Write(text.ToString());
}
}
break;
}
catch
{
//File not available, conflict with other class instances or application
}
if (stopwatch.ElapsedMilliseconds > timeOut)
{
//Give up.
break;
}
//Wait and Retry
await Task.Delay(5);
}
stopwatch.Stop();
}
【问题讨论】:
-
您的实际文件写入不是异步的。你的意思是让他们成为?
-
@StephenCleary,是的,最初有,但你不应该在锁中等待,所以我不得不改变它。我不确定这会在多大程度上破坏整个事情。
-
这听起来应该在 codereview tbh 上
-
也许吧。无论如何感谢您的帮助。
-
是否有其他进程可以访问文件路径?因为对于单个应用并发,您可以删除大部分代码。
标签: c# multithreading thread-safety filesystems