C# 访问由单独线程创建的文件

C# 访问由单独线程创建的文件,c#,multithreading,io,file-copying,C#,Multithreading,Io,File Copying,我在复制和访问文件时遇到了多线程问题 我有一个服务,它下载并解压一个Zip存档,然后将一个文件从解压文件夹复制到正确的位置: //Download, and uzip archive... //Copy a needed file to its right location File.Copy(fileName, fileDestination); 然后我启动一个单独的线程,该线程需要访问复制的文件: TheadPool.QueueUserWorkItem(s => processCo

我在复制和访问文件时遇到了多线程问题

我有一个服务,它下载并解压一个Zip存档,然后将一个文件从解压文件夹复制到正确的位置:

//Download, and uzip archive...

//Copy a needed file to its right location
File.Copy(fileName, fileDestination);
然后我启动一个单独的线程,该线程需要访问复制的文件:

TheadPool.QueueUserWorkItem(s => processCopiedFile(fileDestination));
以下是ProcessCopiedFile中的代码片段:

private void ProcessCopiedFile(string filePath)
{
    ...
    //Load the file, previously copied here
    var xml = XDocument.Load(filePath);
    ...
    //Do other work...
}
XDoument.Load调用失败,出现异常:

The process cannot access the file <FileName> because it is used by another process.
该进程无法访问该文件,因为另一进程正在使用该文件。
看起来像文件。复制会锁定结果文件。当所有操作都同步进行时,它就可以正常工作。 你有什么想法吗?
Thx.

File.Copy不会打开或锁定任何内容,它是一种原子操作,需要一些时间,当然这取决于磁盘/网络I/O和文件大小


当然,在从同步移动到异步时,您应该确保在复制仍在进行时不会访问目标文件。

使用流复制文件,以避免windows锁定文件。复制

using(var s = new MemoryStream(File.ReadAllBytes(filePath))
{
    using(var fs = new FileStream(newLocation, FileMode.Create))
    {
        s.WriteTo(fs);
    }
}

首先调用File.Copy(同步),然后启动新线程。因为文件.Copy是同步调用的,它保证在新线程启动之前完成其工作。或者我在某个地方弄错了?+1-只是为了澄清最后一部分:Windows在复制文件时对文件保持独占锁定。正确复制文件是一门非常科学的事情。需要注意在文件中保留文件属性和备用流。不要自己做。