2012-06-21 35 views
0

我有一个Monodroid应用程序,可以完成许多webrequests。我正在从活动中提出请求。因此,我需要一个队列来处理我的活动以外的请求。这是为了避免同时发出多个请求。MonoDroid活动独立任务队列?

因为我正在使用ThreadPool.QueueUserWorkItem在另一个线程上发出请求,它似乎是用户打开一个活动,启动一个请求然后返回打开另一个活动并在第一个请求完成对webrequests的使用之前启动另一个请求锁定并不再起作用。

最好的方法是将活动之外的回调排队请求任务,或者没有人知道/有类似的例子吗?我认为它需要处理上面解释的活动在任务完成前可以关闭/销毁的情况。这可能意味着任务可能会被取消或任务可能会运行,但不会更新UI,因为它不再存在。

在我的情况下,我所做的请求是在不同的功能中做不同的事情,所以更新UI的回调并不总是相同的功能。此外,我用来提出请求的函数具有不同的参数。我不确定这些问题是否会使得解决这个问题变得更加困难/容易,但是我认为我需要重做很多代码。

+0

几个问题:为什么WebRequests“锁定”ThreadPool?这可能是同步提出请求的一个症状......并且这种方法不能很好地扩展。也许你应该看看异步请求的几种方法之一。此外,你确定你没有达到每域限制的最大请求吗? – spender

+0

是的,如果我这样做,Web请求会被锁定。并且这些请求是对同一个域的,所以这可能是这种情况。我发现我可能需要的是某种方式来管理我的所有活动的请求,以便一次完成一个请求,并且如果活动已关闭/销毁,则任何尚未完成的请求都将被取消。 – startupsmith

回答

1

a)使用异步方法来发出请求,以便不会挂起线程池线程。

b)增加您请求的域的连接限制。

ServicePointManager.FindServicePoint(uri).ConnectionLimit=10000; 
+0

感谢您的回答。任何机会,你可以指向我的一个webrequest的异步方法的例子?还有可能是域的主机可能会限制服务器端的并发连接数? – startupsmith

+0

查找包含HttpWebRequest.BeginGetrequest的示例。除了店主以外,没有人知道你所搜索的网站的政策。如果你要锤击网站,可以考虑征求许可。如果你的速度太快,有些网站会阻止你。 – spender