gpt4 book ai didi

c# - 关闭 SQLiteAsyncConnection

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:47 34 4
gpt4 key购买 nike

我在我的 Xamarin Android 项目中使用 sqlite-net-pcl 库( the one by Frank Krueger ,而不是 this fork by Øystein Krog )。到目前为止,SQLiteAsyncConnection 似乎没有 Close 或 Dispose 方法 according to the author .

我有两个问题。首先,将连接用作单例会节省资源吗?其次,我可以使用 sqliteAsyncConnection.GetConnection().Close() 关闭连接吗?

我打算做这样的事情:

public static async Task CloseDbConnectionAsync(SQLiteAsyncConnection dbConnection)
{
await Task.Factory.StartNew(() => dbConnection.GetConnection().Close());
}

最佳答案

分两部分回答我自己的问题:

a) 将 [SQlite 数据库] 连接用作单例会节省资源吗?

是的,根据 this article ,使您的数据库实例在整个应用程序的生命周期中成为单例实例可以防止您打开太多连接而忘记关闭它们。

这是我在 C# 中实现它的方式:

private static SQLiteAsyncConnection _conn;
private static readonly AsyncLock _mutex = new AsyncLock();

private static async Task<SQLiteAsyncConnection> GetDb(Context context)
{
try
{
using (await _mutex.LockAsync())
{
if (_conn != null)
{
return _conn;
}

_conn = new SQLiteAsyncConnection(GetDbPath(context), storeDateTimeAsTicks: false);

return _conn;
}
}
catch (Exception e)
{
throw;
}
}

AsycnLock 是 Nito.AsyncEx 库的一部分。

b) 其次,我可以使用 sqliteAsyncConnection.GetConnection().Close() 关闭连接吗?

库作者已经回复我here .这是目前我的处置方法的样子(尽管我没有在任何地方使用它)。

private static async Task DisposeDbConnectionAsync()
{
using (await _mutex.LockAsync())
{
if (_conn == null)
{
return;
}

await Task.Factory.StartNew(() =>
{
_conn.GetConnection().Close();
_conn.GetConnection().Dispose();
_conn = null;

GC.Collect();
GC.WaitForPendingFinalizers();
});
}
}

我调用 GC 的原因是因为我不确定 dispose 方法是立即释放连接还是直到 GC 运行。

关于c# - 关闭 SQLiteAsyncConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41134100/

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