EF Core中的高并发更新

时间:2017-12-16 22:07:57

标签: c# entity-framework concurrency ef-core-2.0

我经常有一个方法,很多线程都试图更新我的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);
        }
    }

0 个答案:

没有答案