System.Data.SQLite异步加载问题
本文关键字:加载 问题 异步 SQLite Data System | 更新日期: 2023-09-27 18:00:57
我使用System.Data.SQLite
查询带有c#/linq
的数据库。我要显示的行包含来自各个表的数据。我目前所做的是查询一个表,以获得放置在DataGrid中的项目的完整列表。多亏了虚拟化,当相关的Row进入视图时,我可以懒散地查询其他表。这很好用。
现在,我想立即但异步地开始填充行中缺少的数据。但每次在不同的线程中进行延迟加载代码时,我都会收到一个异常">DataReader已关闭"。这与"原始"linq查询是从另一个线程完成的这一事实有关吗?
知道我该怎么解决吗?
以下是一些有望总结问题的代码
//Main thread---
//Start the search
_startEvent.Set();
_mainLoadEvent.WaitOne();
_mainLoadEvent.Reset();
//Worker thread---
_startEvent.WaitOne();
_startEvent.Reset();
SearchAllLiterature(); //Fills _searchResults with rows
_mainLoadEvent.Set(); //Signal to mainthread that all rows are loaded
//Fill in some details for every row, that come from various sources, we'll need them later
foreach (var r in _searchResults)
r.LazyLoadText();
//SearchResultRow.cs
public string Author
{
get
{
LazyLoadText();
return _author;
}
set
{
_author = value;
}
}
//Called by the worker thread or by the DataGrid when a new row comes into view
public void LazyLoadText()
{
lock (this)
{
if (_lazyLoadTextCompleted) return;
_lazyLoadTextCompleted = true;
}
var sb = new StringBuilder();
//this will result in a SQL-query
var authors = from a in _source.ReferenceOrganization
orderby a.Person.LastName
select a.Person;
Author = ConcatAuthors(authors, sb);
//...more queries...
}
在延迟加载循环之后引发_mainLoadEvent不会显示相同的问题。
如果我在LazyLoad方法的整个代码周围放置一个静态锁,这个问题也就解决了。似乎同时启动查询是不好的,但这是真的吗?
我发现SQLite数据上下文不是线程安全的。当linq使用相同的上下文隐式查询where时,我遇到了一个问题。使用几个上下文可以解决这个问题,但不幸的是,上下文有单独的缓存(或者看起来是这样(,所以我在一个线程上进行后台加载不会有利于以后在另一个线程中进行搜索。这基本上就是整个想法。如果您当前没有在主线程中访问数据库,那么在后台加载仍然很有用。尽管我还没有真正找到一种优雅的方法来确定这一点。
Ok在读取器关闭之前尝试Thread.Sleep((;p我认为你的第二根线需要很长时间才能完成,对吧?。。。那么,如果你的连接在其他数据加载之前就关闭了,它怎么可能工作呢?你可能会做一些事情,比如如果(thread2已完成(,然后完成主线程。。。否则等待;p
我冗长地搞砸了一点XD。。。
我不确定这是否是你的问题。。。;p很抱歉,如果这没有帮助。。。我喜欢5个月编程经验:P