【问题标题】:Calling await operation after acquiring mutex [duplicate]获取互斥体后调用等待操作[重复]
【发布时间】:2015-07-30 14:48:19
【问题描述】:

在获取mutex 后,如何使用await FileIO.WriteTextAsync()(在Windows Phone 8.1 中)写入文件,以确保没有两个线程访问同一个文件并确保互斥。我正在执行以下操作:

mutex.WaitOne()

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

但该方法仅适用于一两次迭代,之后它会抛出一个System.Exception。另外,如果我删除await 关键字或完全删除文件写入方法,代码运行得非常好。所以,所有的麻烦都是由调用异步方法引起的。我该怎么做才能解决这个问题?

【问题讨论】:

  • 如果您在同一进程中保护资源,那么Luaan's answer 应该可以完成这项工作。如果您需要保护进程之间的资源(我认为互斥锁的主要作用),请查看this question

标签: c# windows-phone-8.1 mutex


【解决方案1】:

这是一个监视器的工作(或者为了使它对异步更友好,一个信号量),而不是一个互斥体。

问题是WriteTextAsync 的延续很可能在单独的线程上运行,因此它无法释放互斥锁 - 只能从最初获得的同一个线程中完成互斥体。

var semaphore = new SemaphoreSlim(1);

await semaphore.WaitAsync();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 2012-06-13
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多