Вызов операции ожидания после получения мьютекса

Как я могу записать в файл с помощью await FileIO.WriteTextAsync() (в Windows Phone 8.1) после получения mutex, чтобы никакие два потока не обращались к одному и тому же файлу и было обеспечено взаимное исключение. Я делаю следующее:

mutex.WaitOne()

try
{
    await FileIO.WriteTextAsync(filename, text);
    Debug.WriteLine("written");
}
finally
{
    mutex.ReleaseMutex();
}

Но метод работает только одну-две итерации, после чего выдает System.Exception. Кроме того, если я удалю ключевое слово await или полностью удалю метод записи файла, код будет работать отлично. Итак, все проблемы вызваны вызовом асинхронного метода. Что я могу сделать, чтобы решить эту проблему?


person nimbudew    schedule 30.07.2015    source источник
comment
Если вы охраняете ресурсы в том же процессе, то ответ Luaan должен выполнить эту работу. Если вам нужно защитить ресурсы между процессами (основная роль мьютекса, как я думаю), взгляните на этот вопрос .   -  person Romasz    schedule 30.07.2015


Ответы (1)


Это работа монитора (или, чтобы сделать его более асинхронным, семафора), а не мьютекса.

Проблема в том, что продолжение до WriteTextAsync, скорее всего, будет выполняться в отдельном потоке, поэтому он не может освободить мьютекс — это можно сделать только из того же потока, который первоначально захватил мьютекс.

var semaphore = new SemaphoreSlim(1);

await semaphore.WaitAsync();

try
{
    await FileIO.WriteTextAsync(filename, text);
    Debug.WriteLine("written");
}
finally
{
    semaphore.Release();
}
person Luaan    schedule 30.07.2015