c#/linq
でデータベースにクエリするのにSystem.Data.SQLite
を使用しています。 表示する行には、さまざまなテーブルのデータが含まれています。私が現在行っていることは、DataGridに配置するアイテムの完全なリストを取得するために1つのテーブルを照会することです。仮想化のおかげで、関連する行が表示されるので、他のテーブルを遅延クエリすることができます。これは正常に動作します。System.Data.SQLite非同期ロードの問題
今、行の欠落しているデータをただちに非同期で入力したいと考えています。しかし、「DataReaderが終了しました」という例外が発生します。たびに、別のスレッドで遅延読み込みコードを実行します。これは、 "元の" linqクエリが別のスレッドから行われたという事実と関係していますか?
どのように私はこれを修正できますか?ここで
がうまくいけば、遅延ロード・ループは同じ問題が表示されない_mainLoadEventを上げる
//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...
}
後に問題をまとめていくつかのコードです。
LazyLoadメソッドのコード全体に静的ロックを設定すると、この問題も解決されます。同時にクエリを開始するのは問題ないようですが、これは本当ですか?
関連するコードを投稿してください... –
私のポストにいくつかのコードを追加しました。面白いことに、レイジーローディングを開始する前に、ワーカースレッドが約1秒間スリープすると、問題はなくなります。私は、これは、表示する必要がある行の怠惰な読み込みを完了するのに十分な時間UIを与えると思います。しかし、なぜこれが問題なのでしょうか?ロック機構が間違っていますか? –