我需要根据存储在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
}
}
答案 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