我经常有一个方法,很多线程都试图更新我的SQLite数据库。
例如,在我的数据库中,我想存储有多少结果是可以的,有多少是不合适的。每当我得到一个新结果时,我也想更新我的数据库。因为这种方法需要很多锁,我想,我想创建一个每隔x秒更新当前值的计时器。但也许有更好的方法。
我是怎么做到的:
private Timer _timer;
private volatile bool _updateThreadStarted;
private int _ok;
private int _notOk;
public async Task AddAsync(Result result)
{
if (result.Successful)
{
using (var context = CreateContext())
{
context.Results.Add(result);
await context.SaveChangesAsync();
}
Interlocked.Increment(ref _ok);
}
else
{
StartUpdateThread();
Interlocked.Increment(ref _notOk);
}
}
private void StartUpdateThread()
{
if (!_updateThreadStarted)
{
_updateThreadStarted = true;
Log.Debug("Database update thread started...");
_timer = new Timer(async _ =>
{
using (var context = CreateContext())
{
var first = await context.Results.FirstAsync();
first.Ok = _ok;
first.NotOk = _notOk;
await context.SaveChangesAsync();
}
}, null, 1000, 1000);
}
}