2016-03-09 67 views
0

我正在研究带有telerik控件的WPF应用程序。并发多线程C#

我正在使用RadListBox,它绑定到集合。当我选择每个RadListBoxItem时,BindedItem的详细视图将显示在附近的面板中。一次只能选择一个RadListBoxItem

在下面的逻辑我正在做了以下功能,

  1. 编辑
  2. 转为新
  3. 快讯保存或放弃
  4. 保存/放弃
  5. 负载所选

现在的问题是当警报引发S ave/Discard,如果我点击保存,则启动保存过程,但在保存完成之前,加载也在另一个线程中运行。我必须检查保存是否完成并开始加载过程。

// XAML代码:

<telerik:RadListBox x:Name="lstMarketSeries" ItemsSource="{Binding SCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, ValidatesOnDataErrors=True}" SelectedItem="{Binding SelectedMSeries, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" telerik:StyleManager.Theme="Windows8"> 
<i:Interaction.Triggers> 
    <i:EventTrigger EventName="SelectionChanged"> 
    <i:InvokeCommandAction Command="{Binding LoadSelected}"/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 
</telerik:RadListBox> 

//视图模型:

public ICommand LoadSelected { get { return new RelayCommand(LoadSelectedSDetails); } } 

/// <summary> 
/// Load selected series 
/// </summary> 
private async void LoadSelectedSDetails() 
{ 
    if (SCollection != null) 
    { 
     if (!IsChanged()) 
     { 
      bw = new BackgroundWorker(); 
      bw.RunWorkerAsync(); 

      bw.DoWork += (s, e) => 
      { 
       //Loading functionality here(Have to check if the save is complete) 
      }; 

      bw.RunWorkerCompleted += (s, e) => 
      { 
       IsBusy = false; 
      }; 
     } 
     else 
     { 
      await PutTaskDelay(); // This delay is to wait for save to complete 
      LoadSelectedSDetails(); 
     } 

/// <summary> 
/// Check if collection is changed 
/// </summary> 
private bool IsChanged() 
{ 
    bool IsChanged = false; 
    if (SCollection != null) 
     IsChanged = SCollection.Where(x => x.IsChanged || x.IsNew).Count() > 0; 

    if (IsChanged) 
    { 
     if (ShowMessages.SaveOrDiscardBox()) 
     { 
      SaveAllDetails(); // Saving runs in a separate thread. 
     } 
     else 
     { 
      //Discard functionality goes here 
     } 
    } 

    return IsChanged; 
} 

在这个问题请帮助。

+0

我想你混淆'ListBoxItem'与列表框本身。如果您的集合中有10个项目,则不会创建10个列表框,而是在单个列表框中创建10个列表框项目。 –

+0

@SriramSakthivel:是的,谢谢。已经更新了这个问题。 – iamCR

+0

只需删除使执行同步的'async/await'。如果您不想阻止UI,请使用相同的'WorkerThread'一个接一个地运行Action,并使用'Dispatcher'进行UI更新。另一种选择是[Backgroung Worker](http://stackoverflow.com/a/5483644/2819451) – Gopichandar

回答

0

如果你想要做一个Task东西后执行,你可以使用ContinueWith

 var saveTask = new Task<ReturnedObject>(() => //if you don't need values in order to update the UI you can use Task not Task<T> 
        { 
         //do your save action and return something if you want 
        }); 

        //start thread 
        saveTask.Start(); 

        saveTask.ContinueWith(previousTask => 
        {//after the first thread is completed, this point will be hit 

         //loading action here 

         //UI region if needed 
          Application.Current.Dispatcher.BeginInvoke((ThreadStart)delegate 
          { 
           //update UI 
          }, DispatcherPriority.Render);    

        }, TaskScheduler 

    .FromCurrentSynchronizationContext()); 
+0

谢谢你的样品。但我需要它作为验证前一个的另一种方法。 – iamCR