gpt4 book ai didi

c# - C# sqlite 中的多线程

转载 作者:IT王子 更新时间:2023-10-29 06:27:24 35 4
gpt4 key购买 nike

我在 C# wpf 应用程序中编程并使用 Sqlite 数据库。假设我有 25 个辅助线程都在等待对数据库执行插入操作。现在主线程对数据库执行选择操作。我可能是错的,但是这个主线程会等待一段时间。我如何确保。所以我将数据库锁定在我的日志文件中。我如何确保主线程获得最高优先级,以便我的 UI 不被阻塞。我正在使用 DBContext 对象执行数据库操作。?

最佳答案

巧妙地使用 ReaderWriterLockSlim 一定会帮助您提高性能。

    private ReaderWriterLockSlim _readerWriterLock = new ReaderWriterLockSlim();

private DataTable RunSelectSQL(string Sql)
{
DataTable selectDataTable = null;
try
{
_readerWriterLock.EnterReadLock();
//Function to acess your database and return the selected results
}
finally
{
_readerWriterLock.ExitReadLock();
}
return selectDataTable;
}

private DataTable RunInsertSQL(string Sql)
{
DataTable selectDataTable = null;
bool isbreaked = false;
try
{
_readerWriterLock.EnterWriteLock();
if (_readerWriterLock.WaitingReadCount > 0)
{
isbreaked = true;
}
else
{
//Function to insert data in your database
}
}
finally
{
_readerWriterLock.ExitWriteLock();
}

if (isbreaked)
{
Thread.Sleep(10);
return RunInsertSQL(Sql);
}
return selectDataTable;
}

试试这个,它会提高你的响应能力,你有 Select 查询以比 Insert SQL 更高的优先级触发。

请注意,如果某些插入已经在运行,那么 Select 将至少等待该插入完成。此代码始终优先于 SELECT INSERT

还有一点,永远不要像从数据库中选择那样在主线程上执行长时间持续操作,而是在后台执行操作然后使用主线程在 UI 上反射(reflect)最新结果。这将确保您的 UI 永远不会卡住。

EDIT 可能会出现饥饿情况,如果有连续的SELECT,所有INSERT可能都在等待查询被无间断地触发。
但我相信在您的情况下,这不会发生,因为 UI 不会总是刷新以如此频繁地获取最新更改,而中间没有任何时间片。

关于c# - C# sqlite 中的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20001129/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com