要获取100个好友头像HttpWebRequest发送100个请求,而这100个请求完成后来到同一个回调方法里写头像文件,请问如何做到同步。(如果我的表达还不够明白请提出来,我会详细的解释)
因为在获取好友信息时是先获取好友的Profile,在所有的好友Proflie信息获取完成之后将这些信息存到缓存中。接下来根据Proflie里面的PhotoUrl字段去请求好友头像,在e.result中只返回一个Stream和PhotoUrl,我需要根据PhotoUrl来查找缓存中对应的好友,在查找的时候我必须等找到对应的好友并将BitmapSource赋给好友才运行下一个线程进来。之前尝试过Lock、Monitor似乎对异步不管用。
把结果放到集合中,当集合的大小等于 100 时就表示请求都完成了。
可能我刚才描述的问题不准确,重新表述了一遍,谢谢你的回复
1、设立一个全局的计数count=100。
2、创建100异步线程请求,并且在线程委托的任务结束时Interlocked.Decrement这个count
3、在排队100个请求的线程中While(Thread.VolateRead(ref count)!=0){Thread.Sleep(500);}
4、如果count=0跳出while循环后,执行你的回调方法写头像文件
可能我刚才描述的问题不准确,重新表述了一遍,谢谢你的回复
要注意lock锁定的对象是否正确。通常为一个“静态“,"私有"的object对象("引用类型")
private static object syncObj=new object();
lock(syncObj)
{
// 这里会保证在syncObj上获取到锁的单个线程进入,其余线程都会等待获取锁
}
请参考:http://www.cnblogs.com/heyuquan/archive/2012/12/31/2840214.html
@滴答的雨: 静态锁也没用,试过了
@Ewan1997: 这就比较奇怪了,锁会不起作用……是引用类型吧,如果锁定对象不能成功的话。就试试实例方式:AutoResetEvent实例,通过WaitOne()等待,待一个线程将BitmapSource赋给好友后调用Set()来启用单个执行。。
(你的操作好像不会导致集合大小的改变,有需要在获取到所有URL后再锁定一个一个来赋值头像吗?)
@滴答的雨: 因为第一次打开这个App的时候,要做的事情太多了,大家都在抢占Cup和宽带资源,所以资源要尽量做到按需来分配,先得到所有好友的Proflie信息,然后从主页进入到好友列表的时候根据屏幕的滑动去动态获取当前屏幕所有好友的头像。
我测试了很多遍锁确实不起作用,AutoResetEvent这个没怎么研究过,同事也给我提过这个,我再查查资料,3Q小雨。