锁定或异步时sqlite的正确用法是什么

use*_*326 5 c# sqlite multithreading locking async-await

我们正在使用Xamarin用SQLite为Android和ios编写C#代码.但是关于如何使用sqlite,我似乎有一个概念上的误解:

Android上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真正的最佳实践是什么?只是使用同步版本?

i3a*_*non 6

同步与异步单一与并发之间存在很大差异,它们共有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)

注意:我的实施AsyncLock


归档时间:

查看次数:

8822 次

最近记录:

11 年,6 月 前