我希望有人可以帮助我,如果有关于使用多个线程/任务写入文件的问题。请参阅下面我的代码示例...多线程写入字节[]到文件
AddFile返回保持的值多头的排列,blobNumber的斑点和数据写入到BLOB大小内侧补偿
public long[] AddFile(byte[] data){
long[] values = new long[3];
values[0] = WorkingIndex = getBlobIndex(data); //blobNumber
values[1] = blobFS[WorkingIndex].Position; //Offset
values[2] = length = data.length; //size
//BlobFS is a filestream
blobFS[WorkingIndex].Write(data, 0, data.Length);
return values;
}
因此,可以说我在像下面这样的foreach循环中使用AddFile函数。
List<Task> tasks = new List<Task>(System.Environment.ProcessorCount);
foreach(var file in Directory.GetFiles(@"C:\Documents"){
var task = Task.Factory.StartNew(() => {
byte[] data = File.ReadAllBytes(file);
long[] info = blob.AddFile(data);
return info
});
task.ContinueWith(// do some stuff);
tasks.Add(task);
}
Task.WaitAll(tasks.ToArray);
return result;
我可以想像,这将完全失败,因为文件将互相覆盖BLOB中由于事实写入功能还没有写完文件1和其他任务在被写入文件2路同一时间。
那么解决这个问题的最好方法是什么?也许使用异步写功能...
您的帮助,将不胜感激! 亲切的问候, 马亭
.NET 4.5将提供异步文件I/O本身,它是更好地保持同步的东西的那一刻(你写无论如何都是同一个物理驱动器,所以操作无法首先进行并行化)。 – Alex