Не могу понять, как работает async?

На сколько я понял (возможно не правильно понял, поправьте), в C# асинхронные методы должны дожидаться, пока общий ресурс освободится, и потом продолжить задачу.

Есть метод:
using(FileStream source = new FileStream(path, FileMode.Open))
                    {
                        using(FileStream target = new FileStream(newPath, FileMode.OpenOrCreate))
                        {
                            await source.CopyToAsync(target);
                        }
                    }


Таки вот, если открыть искомый файл source в другой программе, то возвращается The process cannot access because it is being used by another process.

Это так должно быть, и есть ли возможность подождать?

Спасибо!
  • Вопрос задан
  • 244 просмотра
Решения вопроса 2
freeExec
@freeExec
Участник OpenStreetMap
Асинхронный метод ждёт, когда кто-то внутри метода скажет - ВСЁ готово. Ни про какие общие ресурсы и прочее речи не идёт.
Ответ написан
Casper-SC
@Casper-SC
Программист (.NET)
Конкретно по вопросу: файл открыт в другой программе, скорее всего, на запись в том числе. Логично, что нельзя этот файл ещё раз открыть на запись.
Конструктор FileStream, используемый в вашем коде FileAccess.ReadWrite:
public FileStream(string path, FileMode mode) :
            this(path, mode, (mode == FileMode.Append ? FileAccess.Write : FileAccess.ReadWrite), DefaultShare, DefaultBufferSize, DefaultIsAsync)
        { }


Попробуйте такой код. Он тоже выдаст такую же ошибку, если файл попробовать таким способом открыть только в своём приложении:
using (FileStream source = new FileStream("NLog.config", FileMode.Open))
using (FileStream source2 = new FileStream("NLog.config", FileMode.Open))
using (FileStream target = new FileStream("newPath", FileMode.OpenOrCreate))
{
    await source.CopyToAsync(target);
}


Стоит почитать книгу "Конкурентность в C#. Асинхронное, параллельное и многопоточное программирование"
Скриншот сделан с видео: https://youtu.be/lh8cT6qI-nA?t=1123

5fb13cbe569ab013358287.jpeg
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы