我遇到了一个令人困惑的问题,我不确定问题是我不知道WebClient“OpenReadCompletedEvent”委托,或者我所选择的解决方案是否存在问题服务器端脚本,应用程序与之交互。
这是我的问题:
我有一个定义视频游戏标题的类,我使用WebClient异步打开RSS提要进行阅读,完成后继续使用相同的方法获取用户提交的有关该标题的信息。为此,我循环浏览从RSS提要解析的每个视频游戏标题(GameStop.com的即将推出的游戏的RSS提要),这是我遇到问题的地方,我无法保持所有这些OpenReadCompletedEvent委托同步,或者没有我知道的。
现在我的代码变得尴尬和令人费解,我认为这是不正确的: 注意:游戏是游戏对象列表。
List<Thread> threads = new List<Thread>();
for(int i = 0; i < games.Count; i++)
{
threads.Add(new Thread(downloadHype));
threads[i].Start(i);
}
public void downloadHype(object data)
{
int index = (int)data;
String tempUrl = String.Format("http://slyduck.com/hypemachine/frontend.php?intent=2&guid={0}", games[index].GuidString);
WebClient client = new WebClient();
client.OpenReadAsync(new Uri(tempUrl));
client.OpenReadCompleted += new OpenReadCompletedEventHandler(
delegate(object sender, OpenReadCompletedEventArgs e)
{
if (e.Error == null)
{
XDocument xdoc = XDocument.Load(e.Result);
games[index].Hype = (from item in xdoc.Descendants("hype")
select new Hype()
{
Id = uint.Parse(item.Element("id").Value),
GameId = uint.Parse(item.Element("game_id").Value),
UserId = uint.Parse(item.Element("user_id").Value),
Score = (uint.Parse(item.Element("score").Value) == 1)
}).ToList();
}
});
}
我有更简单的方法来组织这个吗?我考虑过将一组游戏guids作为GET或POST参数发送的可能性,以减轻创建这么多WebClient所产生的一些垃圾,但我不确定这是否是正确的解决方案。
我研究过同步类和并行类,但它们在SilverLight的.NET实现中不可用。
非常感谢任何帮助。谢谢!
答案 0 :(得分:0)
你产生了太多的线程。记住,一个新线程会立即消耗1MB的虚拟地址空间。
如果您有一个具有ID(GUID)的用户,请通过guid获取数据(如您所知),但您的XML应该是Hype的列表,而不仅仅是一个。
换句话说,使用XML的不同结构。然后你只需要一个背景线程和一个WebClient来获取整个列表。