C# 关于平行。用于和锁定

C# 关于平行。用于和锁定,c#,.net,parallel-processing,C#,.net,Parallel Processing,这是我的.NET4.5C代码的一部分,用于将文件从“plainpath”复制到“copypath” 但它不会复制原始文件的某些部分 你能告诉我我在这方面的错误吗?暂时忘掉平行线吧。文件有什么问题,收到了吗?读在哪里声明?与该字段存在线程竞争。这是显而易见的。这个函数将被更改为慢速加密函数,所以我将函数改为慢速加密函数。但是如果Seek和Read在同一个锁中,它也可能有争用条件?这些锁将阻止线程并行运行。首先,您应该将lock1分为readLock和writeLock。但看起来可能会有更多的问题。

这是我的.NET4.5C代码的一部分,用于将文件从“plainpath”复制到“copypath”

但它不会复制原始文件的某些部分


你能告诉我我在这方面的错误吗?

暂时忘掉平行线吧。文件有什么问题,收到了吗?读在哪里声明?与该字段存在线程竞争。这是显而易见的。这个函数将被更改为慢速加密函数,所以我将函数改为慢速加密函数。但是如果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);
                }
            }
        });
    }
}