誰かが私を正しい方向に向けてくれることを願っています。私は近づいていると思いますが、スレッド化を行ったことがなく、構文/概念に行き詰まり続けています。最初の部分は機能していると思いますが、スレッドの所有者に関して素敵な WPF エラーがあります。Dispatcher または BackGroundWorker を使用してスレッドにたどり着いたことはなんとなくわかっていますが、時間が不足しています。今夜、一人で解決するにはあまりにも多くの壁にぶつかっています。これが私が失敗している部分です:
Private Sub FilterData(viewSource As CollectionViewSource, Filter As Expression(Of Func(Of person, Boolean)))
_repository.GetFilteredPersons(Filter)
viewSource.Source = _repository.FilteredPersons
End Sub
さて、この次のビットは、A) 動作するか、B) まだ証明していないので、私を騙していると思います:)。
Public Property FilteredPersons() As ObservableCollection(Of Person)
Public Async Sub GetFilteredPersons(criteria As Expression(Of Func(Of Person, Boolean)))
FilteredPersons = Await FilterPersons(criteria)
End Sub
Private Async Function FilterPersons(criteria As Expression(Of Func(Of Person, Boolean))) As Task(Of ObservableCollection(Of Person))
Return Await Run(Function()
Dim res = New ObservableCollection(Of Person)
_context = New caredocsSQLEntities
Dim test = _context.Persons.Where(criteria).Select(Function(o) New With { _
.Person = o, _
.events = o.events.Where(Function(e) e.eventDateTime >= Startdate And e.eventDateTime <= Enddate).OrderByDescending(Function(x) x.eventDateTime)
})
For Each t In test
res.Add(t.Person)
Next
Return res
End Function
)
End Function
最後に、正確なエラーはThe calling thread cannot access this object because a different thread owns it
です。
もう一度食べたり読んだりする機会があれば、数時間後にもう一度これに取り組むつもりです. しかし、誰かが私が頭を悩ませている明白な愚かさを教えてくれるなら、むしろ感謝します!!
コンテキストは、子ナビゲーションがフィルタリングされたプロパティを持つEntity Framework 5 ObservableCollectionです-コードがそれを完全に言っているとは思いません:)。
ありがとうございました :)。
要求どおり、例外が発生しました。これは、リポジトリ コードで発生します。スレッドのものは赤いニシンです。
System.InvalidOperationException occurred
HResult=-2146233079
Message=The calling thread cannot access this object because a different thread owns it.
Source=System.Data.Entity
StackTrace:
at System.Data.Objects.ELinq.QueryParameterExpression.EvaluateParameter(Object[] arguments)
at System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
at System.Data.Entity.Internal.Linq.InternalQuery`1.GetEnumerator()
at System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.Generic.IEnumerable<TResult>.GetEnumerator() at SomeEntity.Models.PersonRepository._Closure$__2._Lambda$__7() in E:\Dropbox\Work Experimental\SomeEntity - Copy\SomeEntity\Models\PersonRepository.vb:line 30
内部例外:
これは例外全体であり、ここで発生します。
For Each t In test
res.Add(t.Person)
Next
昨夜の記事を読んで、少し理解が深まりましたが、まだリポジトリ クラスに適用するのに苦労しています。これは通常、構文の混乱の組み合わせであり、私の側ではうまく理解できません。getfiltered レジデントの操作の一部を await タスクに分割できるはずだと感じていますが、まだそれを理解できていません。今日の仕事 - エンティティ フレームワークをこのように使用できるかどうか!