我了解 Silverlight 的异步特性,但不断阻碍我编写有效 UI 的能力的一件事是使用带外加载数据的对象引起的竞争条件和重入问题。有什么方法可以强制按代码中的顺序对带外操作进行排序?
例如,假设我有一个带有 Load 方法的对象,该方法的唯一工作是将数据从流加载到文本框中。如果我这样调用它异步:
Object.Load( targetbox1 );
Object.Load( targetbox2 );
Object.Load( targetbox3 );
目标框将以任何给定的顺序加载。如果我出于某种原因重新输入加载代码,那么两个加载会尝试同时发生并插入同一个文本框,从而导致异常。这些对象中的大多数都支持事件,我可以这样连接一个回调:
Object.Loaded ( s, e ) => {
Object.Load( targetbox2 );
Object.Loaded( s, e ) => {
...
}
}
Object.Load( targetbox1 );
但是你看到了嵌套的问题。
是否有任何简单的方法可以让这些操作以串行方式运行,以便一个调用在前一个操作完成之前不会继续,而是以一种可以全面应用的简单直观的方式进行?
最佳答案
我写了几篇博客文章 here和 here解决这个问题。第一个详细描述了解决方案的内部结构,第二个介绍了如何使用场景。
这是一个基于您的对象 Load/Loaded 的伪示例:-
AsyncOperation Load(YourObject subject, TextBox target)
{
return (completed) =>
{
EventHandler eh = null;
eh = (s, args) =>
{
subject.Loaded -= eh;
completed();
}
subject.Loaded += eh;
subject.Load(target);
}
}
这样你的序列看起来像这样:-
IEnumerable<AsyncOperation> LoadTextBoxes()
{
yield return Load(subject1, textbox1);
yield return Load(subject2, textbox2);
yield return Load(subject3, textbox3);
}
并执行:-
LoadTextBoxes().Run(e =>
{
if (e != null)
{
//Something bad happened.
}
});
主要目标是序列是有保证的,只要你喜欢就可以,没有讨厌的嵌套,可以使用循环,你甚至可以包含其他代码以在序列中的特定点执行。
关于silverlight - 以串行方式在 Silverlight 中运行异步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6364109/