Доступ к файлу, созданному отдельным потоком - PullRequest
0 голосов
/ 24 октября 2011

У меня проблема с многопоточностью при копировании и доступе к файлам.

У меня есть служба, которая загружает и распаковывает 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.

Похоже, File.Copy сохраняет файл результатов заблокированным. Когда все работают синхронно, все работает без ошибок. У тебя есть мысли? Thx.

Ответы [ 2 ]

1 голос
/ 24 октября 2011

File.Copy не держит ничего открытым или заблокированным, это атомарная операция, которая требует некоторого времени, в зависимости, конечно, от дискового / сетевого ввода-вывода и размера файла.

Конечно, при переходе от синхронизации к асинхронности вы должны убедиться, что у вас нет доступа к файлу назначения, пока копирование еще выполняется.

0 голосов
/ 24 октября 2011

Скопируйте файл с потоком, чтобы избежать блокировки окон из File.Copy

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