2014-05-05 46 views
1

我想删除后台线程上的实体,但我们不能删除它创建的另一个线程上的实体,所以我怎么做,并保持ui响应?我绑定使用backgroundworker类在这里是代码c# - 实体框架多线程

void deletePeriodWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      Thread.Sleep(3000); 
      List<Period> selectedPeriods = e.Argument as List<Period>; 

      foreach (Period period in selectedPeriods) 
      { 
       while (period.Transactions.Count > 0) 
       { 
        Transaction transaction = period.Transactions[0]; 
        this.Dispatcher.Invoke(new Action(() => context.Transactions.Remove(transaction)), 
         System.Windows.Threading.DispatcherPriority.Normal); 
       } 

       this.Dispatcher.Invoke(new Action(() => context.Periods.Remove(period)), 
        System.Windows.Threading.DispatcherPriority.Normal); 
      } 
      this.Dispatcher.Invoke(new Action(() => context.SaveChanges()), 
        System.Windows.Threading.DispatcherPriority.Normal); 
     } 

回答

2

不要使用'foreach'来删除实体。当你删除一个实体时,源被改变了,它可能会抛出一个异常。改用'for'。为什么在新线程中删除它?当所有删除操作完成后,UI将会更新。

尝试这样的:

UI(列表):的ItemSource = {结合LstTest}

背景:

deletePeriodWorker_DoWork() {

 List<Period> selectedPeriods = e.Argument as List<Period>; 

     foreach (Period period in selectedPeriods) 
     { 
      while (period.Transactions.Count > 0) 
      { 
       //operation 
      } 

      //ui updating 
      this.Dispatcher.Invoke(new Action(() => LstTest.Remove(period)), 
       System.Windows.Threading.DispatcherPriority.Normal); 

      //EF updating 
      context.Periods.Remove(period); 

     } 

     //context savechanges 

}

+0

眼看该来源是一个普通的“清单”它不能通过删除实体来改变,所以使用'foreach'是非常好的,更具可读性。 –

+0

Rang但是如果实体被删除,如果需要一段时间,ui会继续响应,会发生什么? – Lerner

+0

是的你是对的。我没有看到代码是'context.Periods.Remove(XX)'。我们无法在'foreach'中将项目添加/删除到集合中。 – Rang