我使用System.Data.SQLite
以c#/linq
查詢數據庫。 我想要顯示的行包含來自各種表格的數據。我目前所做的是查詢一個表以獲取我放置在DataGrid中的項目的完整列表。感謝虛擬化,我可以懶懶地查詢其他表格,因爲相關的行進入視圖。這工作正常。System.Data.SQLite異步加載問題
現在我想開始在行中立即填寫缺失的數據,但是是異步的。但我收到一個異常「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方法的整個代碼中加入靜態鎖,問題也解決了。似乎並行地開始查詢並不好,但這可能是真的嗎?
請張貼一些相關的代碼... – 2011-07-01 11:35:13
我在我的文章中添加了一些代碼。有趣的是,如果在啓動延遲加載之前,工作線程休眠約1秒,問題就會消失。我想這給了UI足夠的時間來完成那些需要顯示的行的延遲加載。但爲什麼這是一個問題?我的鎖機制錯了嗎? –