Файловый ввод-вывод в рамках действия ASP.NET MVC - PullRequest
1 голос
/ 30 апреля 2011

Можно ли использовать некую «критическую секцию», чтобы можно было совершить что-то подобное в действии ...

public ActionResult GenerateTasks()
{
    string someDir = ....

    if (!Directory.Exists(someDir))
    {
        Directory.CreateDirectory(someDir);
    }

    ...
}

Ответы [ 2 ]

1 голос
/ 30 апреля 2011

Вы можете сделать это только с помощью общесистемного мьютекса.Примитивы блокировки процесса или домена приложения не будут работать при определенных условиях (например, при повторном использовании пула приложений).

Однако для конкретного случая здесь нет необходимости: Directory.CreateDirectory уже выполняет проверку существования самостоятельно, так что вам не нужно ничего делать в этом отношении.

0 голосов
/ 30 апреля 2011

Я предполагаю, что по вашему вопросу одновременная безопасность вас интересует, создается ли каталог между Directory.Exists и Directory.CreateDirectory вдругая тема.(Если вы обеспокоены тем, что Directory.CreateDirectory выдает исключение, если каталог уже существует, этого не произойдет.) Если это так, то это именно тот момент в вашем коде, который потенциально может это сделатьзатем вы можете просто использовать объект блокировки, чтобы сделать этот набор операций безопасным в нескольких потоках:

private static object lockObject = new object();

public ActionResult GenerateTasks()
{
    string someDir = ....

    lock(lockObject)
    {
        if (!Directory.Exists(someDir))
        {
            Directory.CreateDirectory(someDir);
        }
    }
    ...
}

Это, однако, не дает никаких гарантий, что каталог не взаимодействует вне вашего контроля,скажем, в другом процессе подачи заявки.

...