windows-runtime - Metro App FileIO.WriteTextAsync 多线程

标签 windows-runtime locking .net-4.5 winrt-async

我有一个从多个线程频繁调用的方法。它涉及使用 await FileIO.WriteTextAsync 写入磁盘.这在从单个线程调用时工作正常,但是一旦我开始在多个线程中执行此操作,就会收到此错误:

The process cannot access the file because it is being used by another process.

我知道错误意味着什么,但我不确定如何解决它。通常,我会创建一个 lock(object)语句,以确保一次只有一个线程访问该文件。但是,这是一种异步方法,因此我不能使用 await lock(object) 主体中的运算符陈述。

请告知如何处理这种情况。

最佳答案

您可以使用 SemaphoreSlim充当 async -兼容锁:

SemaphoreSlim _mutex = new SemaphoreSlim(1);

async Task MyMethodAsync()
{
  await _mutex.WaitAsync();
  try
  {
    ...
  }
  finally
  {
    _mutex.Release();
  }
}

就个人而言,我不喜欢 finally ,所以我通常自己写IDisposable在处置时释放互斥锁,我的代码如下所示:
async Task MyMethodAsync()
{
  // LockAsync is an extension method returning my custom IDisposable
  using (await _mutex.LockAsync()) 
  {
    ...
  }
}

关于windows-runtime - Metro App FileIO.WriteTextAsync 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17000227/

相关文章:

sql-server - 从 SQL Server 导入时,sqoop 是否获取任何锁?

c# - 我应该使用哪种 MySql InnoDB 事务隔离级别?

c# - 从 vb.net 运行的异步任务

xaml - Winrt 中的网格效果

c# - WinRT C#,Facebook 共享选项里面的共享魅力重定向到自己的控制?

c# - 当 Windows Phone 应用程序处于 ARM 构建配置时,可移植类库不会重新编译

c# - 无法连接到远程服务器,但可以在 fiddler 运行 Metro 应用程序时使用

C# Metro 应用程序如何从网络加载图像

objective-c - 如何在Objective-C中的原子属性的ivar上创建手动锁定?

c# - 从受密码保护的 Zip 文件中提取