如何逐个调用多个调用操作?

时间:2012-08-17 10:26:02

标签: c# silverlight silverlight-5.0

我需要根据存储在ObservableCollection中的用户选择的项目调用一些调用操作(所有不同的操作),并返回字符串/ int值。

现在,当选择只是一个项目时,我可以直接调用并使用Completed事件并获取我的返回值。

我在列表中有大约< = 8项我需要迭代并对每个项执行invoke操作。

我看到foreach不会真正等待InvokeOperation完成,只是连续迭代直到列表的末尾,使它们并行运行... ...

如何一次只执行一个操作并仅在上一个操作完成时进行迭代(无论结果如何)?

我正在寻找1比1执行InvokeOperations。一些线索,提示..?

如果我不清楚,请告诉我。

干杯。

编辑:InvokeOperation(s)彼此不同。他们每个人都在DB上进行不同的操作,这可能是耗时的。查看执行它们1-1的主要原因是用每个操作的输出(成功/失败)更新用户屏幕而不是一次完成所有操作

//Pseudo-code
foreach (var item in SelectedItems) 
{

    var id = item.ID;

    switch(id) 
    {    
      case: 1
         InvokeOperataion<int> inv = context.PerformUpdateFor_1(item);
         inv.Completed += (s,a) => { 
         //get the value assign it to Textblock.
         };
         break;
      case: 2
         InvokeOperataion<int> inv = context.PerformUpdateFor_2(item);
         inv.Completed += (s,a) => { 
         //get the value assign it to Textblock.
         };
         break;
//Other cases similar to this    
   }

}

1 个答案:

答案 0 :(得分:2)

查看Silverlight的Reactive Extensions。您可以轻松地将RIA服务InvokeOperation包装在代表其异步完成的IObservable中。一种方法是使用Observable.Create方法。

之后,您将能够以多种方式撰写IObservables的集合:使用Observable.Concat按顺序执行它们,使用Observable.ForkJoin并行执行它们,过滤它们,加入他们等等。

我已经成功地将它用于RIA Services的加载操作,并且在较小程度上调用了操作。在我看来,可观察性的可组合性比明确地编写回调方法要好得多。

这是一篇博客文章,概述了加载操作的方法,但方法非常相似:Linq Query Expression Syntax with RIA Domain Context