假设我有一个保存到文件的异步方法:
async Task SaveToFileAsync()
{
var file = await folder.GetFileAsync ( ...)
var stream = file.OpenFileAsync(...)
///etc
}
现在想象SaveToFileAsync同时被调用两次。这是一个问题,因为您无法同时在同一个文件上写入
如果这是常规方法,lock()会解决这个问题:
void SaveToFile()
{
lock(something)
{
/// code here
}
}
但是,异步方法中不允许锁定。
当然,可以调用Monitor.Enter()或使用互斥锁,但这些对象可以使用线程,而不是任务。因此他们不是答案。
因为lock()不是一个选项,如何同步多个任务? 特别是,我应该编写什么代码以确保一次只调用一次“SaveToFileAsync”?
答案 0 :(得分:25)
对于异步互斥机制,请查看
Building Async Coordination Primitives, Part 6: AsyncLock
您可以使用AsyncLock
类:
private readonly AsyncLock m_lock = new AsyncLock();
async Task SaveToFileAsync()
{
using (await m_lock.LockAsync())
{
var file = await folder.GetFileAsync(...);
var stream = await file.OpenFileAsync(...);
// etc
}
}