ConcurrentQueue 및 BlockingCollection에 대한 도움이 필요합니다.호출 메서드로 돌아 가기 - BlockingCollection 큐 항목
시나리오는 요청을 제한하고 1 초당 한도를 준수하려고 시도 할 때 대기열에서 항목을 dequeue 할 때 제한이 발생합니다. 응용 프로그램은 MVC 4 응용 프로그램이므로 주어진 시간에 여러 제작자가있을 수 있으며 접촉하는 소비자/웹 서비스는 하나뿐입니다.
- 프로듀서
GetUser(string url)
는 요청이 단지 URL입니다, 큐에 요청을 추가합니다. - BlockingCollection의 첫 번째 항목을 처리하여 몇 가지 검사를 수행하여 제한을 위반하지 않았는지 확인합니다.
- 소비자의 응답을 다운로드하십시오.
- 그런 다음 어떻게 든 다운로드 응답을 호출 메소드에 반환하십시오. ThrottledDownload
간단히 말해서 대기열에서 항목을 처리하고 응답을 다운로드 한 다음 호출하는 방법으로 다시 보내고 싶습니다. 호출 메소드로 다시 보내면 어디서 붙어 있을까요? 여기에 어떤 옵션이 있습니까?
//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?
}
}
스레드 풀만 사용하는 것이 아닌 수동으로 작업자를 만드는 이유가 있습니까? 그것의 소리로'Task.Run'에 대한 호출에서 작업을 수행 할 수 있습니다.이 경우 처리 결과를'Task'에서'ContinueWith' 호출을 통해 사용할 수 있습니다. – Servy
@Servy 순차적으로 작업 (Http 웹 서비스 요청)을 실행하고 초당 요청 1 건의 규칙을 준수해야합니다. 내가 스레드 안전 큐 (thread safe queue)가 그것에 대해 읽은 후에 이상적이라고 생각할 때 나는 ThreadPool을 보았다. 실제로, 멀티 프로듀서 단일 소비자 시나리오에서 결과를 호출 프로세스로 다시 반환하는 방법을 모르겠다. – gdp
"결과 반환"이 의미하는 바를 자세히 (질문을 편집하여 자세히) 제공하십시오. 요청이 어디에서 왔는지, 그리고 작업이 완료되었을 때 알려주고 싶은 프로세스 나 스레드가 무엇인지는 분명하지 않습니다. –