C# 关于平行。用于和锁定
这是我的.NET4.5C代码的一部分,用于将文件从“plainpath”复制到“copypath” 但它不会复制原始文件的某些部分C# 关于平行。用于和锁定,c#,.net,parallel-processing,C#,.net,Parallel Processing,这是我的.NET4.5C代码的一部分,用于将文件从“plainpath”复制到“copypath” 但它不会复制原始文件的某些部分 你能告诉我我在这方面的错误吗?暂时忘掉平行线吧。文件有什么问题,收到了吗?读在哪里声明?与该字段存在线程竞争。这是显而易见的。这个函数将被更改为慢速加密函数,所以我将函数改为慢速加密函数。但是如果Seek和Read在同一个锁中,它也可能有争用条件?这些锁将阻止线程并行运行。首先,您应该将lock1分为readLock和writeLock。但看起来可能会有更多的问题。
你能告诉我我在这方面的错误吗?暂时忘掉平行线吧。文件有什么问题,收到了吗?读在哪里声明?与该字段存在线程竞争。这是显而易见的。这个函数将被更改为慢速加密函数,所以我将函数改为慢速加密函数。但是如果Seek和Read在同一个锁中,它也可能有争用条件?这些锁将阻止线程并行运行。首先,您应该将lock1分为readLock和writeLock。但看起来可能会有更多的问题。那些.Seek操作通常成本很高。这是否仅在SSD上运行?
if (File.Exists(copypath)) File.Delete(copypath);
using (FileStream inputstream = new FileStream(plainpath, FileMode.Open))
{
using (FileStream outputstream = new FileStream(copypath, FileMode.CreateNew))
{
Object lock1 = new Object();
long inputlength = inputstream.Length;
Parallel.For((long)0, (long)(inputlength / bufferSize) + ((inputlength%bufferSize)>0?1:0), (i) =>
{
byte[] parallelbuff = new byte[bufferSize];
long cursor = -1;
lock (lock1)
{
cursor = (long)(i * bufferSize);
inputstream.Seek(cursor, SeekOrigin.Begin);
read = inputstream.Read(parallelbuff, 0, buff.Length);
}
if (read > 0)
{
lock (lock1)
{
outputstream.Seek(cursor, SeekOrigin.Begin);
outputstream.Write(parallelbuff, 0, read);
}
}
});
}
}