如何同步任务
本文关键字:任务 同步 何同步 | 更新日期: 2023-09-27 18:30:49
假设我有一个异步方法可以保存到文件:
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"?
有关异步互斥机制,请查看
构建异步协调基元,第 6 部分:异步锁
您可以使用以下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
}
}