use*_*326 5 c# sqlite multithreading locking async-await
我们正在使用Xamarin用SQLite为Android和ios编写C#代码.但是关于如何使用sqlite,我似乎有一个概念上的误解:
根据stackoverflow的回答,它说 - 一个帮助器和一个数据库连接.在它周围使用锁定以确保任何时候只有一个线程正在访问sqlite db.
我的问题是 - 如果是这样的话 - 异步的用途是什么?
我试图使用同步代码的异步 - 代码给了我正确的编译错误,以避免死锁.
为什么我不能在lock语句的主体中使用'await'运算符?
public async Task InsertAsync<T> (T item){
lock (mutex) {
await asyncConnection.InsertAsync (item);
}
}
public async Task InsertOrUpdateAsync<T> (T item){
lock (mutex) {
int count = await asyncConnection.UpdateAsync (item);
if (0 == count) {
await asyncConnection.InsertAsync (item);
}
}
}
Run Code Online (Sandbox Code Playgroud)
失败.但是 - 如果我要使用锁来确保我一次使用一个连接一个线程作为sqlite中的最佳实践 - 为什么有一个异步sqlite库呢?
为什么有些线程会在网络上推广异步sqlite用法.
在android和iphone中sqlite真正的最佳实践是什么?只是使用同步版本?
同步与异步和单一与并发之间存在很大差异,它们共有4种组合.
在单个 异步情况下,您最多使用一个线程访问数据库,但在整个操作过程中不需要是相同的线程,并且当您不需要线程时(等待IO操作完成时) )你根本不需要任何线程.
一次将async使用限制为单个操作的最基本方法是使用SemaphoreSlimwith initialCount = 1.更好的方法是使用AsyncLock(构建异步协调基元,第6部分: Stephen Toub的AsyncLock):
private readonly AsyncLock _lock = new AsyncLock();
public async Task InsertAsync<T> (T item)
{
using(await _lock.LockAsync())
{
await asyncConnection.InsertAsync (item);
}
}
public async Task InsertOrUpdateAsync<T> (T item)
{
using(await _lock.LockAsync())
{
if (0 == await asyncConnection.UpdateAsync (item))
{
await asyncConnection.InsertAsync (item);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8822 次 |
| 最近记录: |