use*_*719 16 c# asynchronous task microsoft-metro windows-runtime
假设我有一个保存到文件的异步方法:
async Task SaveToFileAsync()
{
var file = await folder.GetFileAsync ( ...)
var stream = file.OpenFileAsync(...)
///etc
}
Run Code Online (Sandbox Code Playgroud)
现在想象SaveToFileAsync同时被调用两次.这是一个问题,因为您无法同时在同一文件上写入
如果这是一个常规方法,lock()将解决这个问题:
void SaveToFile()
{
lock(something)
{
/// code here
}
}
Run Code Online (Sandbox Code Playgroud)
但是,异步方法中不允许锁定.
当然,可以调用Monitor.Enter()或使用互斥锁,但这些对象可以使用线程,而不是任务.因此他们不是答案.
因此,由于lock()不是一个选项,如何同步多个任务?特别是,我应该编写什么代码以确保一次只调用一次"SaveToFileAsync"?
dtb*_*dtb 25
对于异步互斥机制,请看一下
您可以使用以下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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15585 次 |
| 最近记录: |