ConcurrentQueue と BlockingCollection について助けが必要です。
シナリオでは、リクエストを調整し、1 秒あたり 1 リクエストの制限に準拠しようとしています。キューからアイテムをデキューすると、調整が発生します。アプリケーションは MVC 4 アプリであるため、いつでも複数のプロデューサーが存在する可能性があり、私が連絡しているコンシューマー/Web サービスは 1 つだけです。
- プロデューサー
GetUser(string url)
はリクエストをキューに追加します。リクエストは単なる 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?
}
}