silverlight异步陷阱(二)循环
由于异步完成事件不能确定,顺序也不能确定,如果把异步操作放到循环内,可能会产生意想不到的结果。
下面的程序本意是:循环items集合,为每个item赋值。
foreach (BookRankItem item in items)
{
//item只有部分属性有值
//Debug.WriteLine(item.Index);//输出0,1,2,3
EventHandler bookPageHander = (s, e) =>
{
//为item加载数据
BookPage bookPage = service.BookPage;
item.LoadFromPage(bookPage);
PagedItems.Add(item);
Debug.WriteLine(item.Index);//根据网络情况可能是3,3,3,3.只有最后一个
};
service.Loaded -= bookPageHander;
service.Loaded += bookPageHander;
service.Load(item.Uri);
由于赋值操作在异步内执行,执行完的顺序时间都是随机的,PagedItems内容可能是任意的Item。
如果外层循环到最后一个,异步才开始,会导致PagedItems加载的都是最后一项。