我需要一些有关 ConcurrentQueue 和 BlockingCollection 的帮助。
该场景是我试图限制请求并符合每秒 1 个请求的限制,当我从队列中取出一个项目时会发生限制。该应用程序是一个 MVC 4 应用程序,因此在任何给定时间都可能有多个生产者,并且我只联系一个消费者/Web 服务。
- Producer
GetUser(string url)
会向队列中添加一个 Request,一个 request 只是一个 url。 - 通过执行一些检查来处理 BlockingCollection 中的第一项,以确保它不违反限制。
- 下载消费者的回复
- 然后以某种方式将下载响应返回给调用方法。节流下载
简而言之,我想处理队列中的一个项目,下载响应并将其发送回调用方法。将其发送回调用方法是我卡住的地方。我在这里有什么选择?
//I want to do something like this, and wait for the throttled response to return
public class WebService()
{
public string GetUser(string name)
{
var url = buildUrl(name);
var response = string.Empty;
var downloadTask = Task.Factory.StartNew( () => {
response = WebServiceHelper.ThrottledDownload(url);
});
downloadTask.Wait();
return response;
}
}
public static class WebServiceHelper()
{
private static BlockingCollection<Request> requests = new BlockingCollection<Request>();
static WebServiceHelper()
{
foreach(var item in requests.GetEnumerableConsumer()) {
string response = DoWork(item.Url);
//How can i send this back to the calling method?
}
}
public static string ThrottledDownload(string url)
{
//Add the request to the blocking queue
requests.Add(new Request(url, someId));
//How do i get the result of the DoWork method?
}
}