实体框架,异步和WPF线程。我已经到目前为止,但坚持线程

时间:2013-01-07 18:54:39

标签: vb.net multithreading entity-framework-5 async-await

我希望有人能指出我正确的方向;我想我已经接近但我从来没有做过线程并且一直停留在语法/概念上。我相信第一部分是有效的,但是我有一个关于线程所有者的可爱的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

一旦我有机会再次阅读和阅读,我将在几个小时内再次解决这个问题。然而,如果有人能告诉我我不太满意的眩光,我会非常感激!!

上下文是一个实体框架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

InnerException:

这是整个例外,它出现在这里:

  For Each t In test
          res.Add(t.Person)
  Next

我昨晚经历过这些文章,虽然我现在理解它好一点,但我仍然在努力将它应用到存储库类。这通常是语法混淆的结合,而不是我自己得到的。我有一种感觉,我应该能够将getfiltered居民中的部分操作分成等待任务,但还没有成功解决。今天的工作 - 如果实体框架可以这样使用!

0 个答案:

没有答案