[英]could not load file or assembly system.data.sqlite on target machine
[英]System.Data.SQLite asynchronous load problem
我正在使用System.Data.SQLite
使用c#/linq
查詢數據庫。 我要顯示的行包含來自各種表的數據。 我目前所做的是查詢一個表以獲取我放置在 DataGrid 中的項目的完整列表。 多虧了虛擬化,我可以懶惰地查詢其他表,因為相關的 Row 進入視野。 這工作正常。
現在我想立即開始填充行中缺失的數據,但是是異步的。 但是每次我在不同的線程中執行延遲加載代碼時,都會出現異常“ DataReader has been closed ”。 這與“原始” 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 方法的整個代碼周圍放置一個 static 鎖,問題也得到了解決。 似乎不能同時啟動查詢,但這是真的嗎?
我發現 SQLite 數據上下文不是線程安全的。 作為隱式使用相同上下文的 linq 查詢,我遇到了問題。 使用多個上下文可以解決這個問題,但不幸的是,上下文有單獨的緩存(或者看起來是這樣),所以后台加載我做一個線程不會有利於以后在另一個線程上的搜索。 這基本上是整個想法。 如果您當前沒有在主線程中訪問數據庫,則在后台加載仍然很有用。 盡管我還沒有真正想出一種優雅的方法來確定這一點。
好的,在閱讀器關閉之前嘗試 Thread.Sleep();p 我認為您的第二個線程需要很長時間才能完成,對吧?...因此,如果您的連接在您的數據的 rest 加載之前關閉,它應該如何工作? 您可能會執行類似 if(thread2 completed)then 完成主線程...否則等待;p
我有點搞砸了XD...
我不確定這是否是你的問題......;如果這沒有幫助,我很抱歉......我有 5 個月的編程經驗:P
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.