簡體   English   中英

System.Data.SQLite異步加載問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM