Tpl Sample Click here to downloadTPL 구현 문제 내 프로젝트에 TPL을 구현하기 위해 노력하고
안녕, . 웹 클라이언트를 사용하여 5 개의 병렬 HTTP 호출을 만들었습니다.
달성하려는 목표. 5 개의 병렬 호출 중 하나가 "First"가 포함 된 문자열을 반환하면 나머지 호출을 중단하고 "First"를 반환하는 호출을 계속합니다. 내가 시도 무엇
은 :
나는 위의 샘플 코드를 부착했다. 여기서 나는 술어 (Predicate) 함수를 사용했다.
async Task<T> WhenAny<T>(IEnumerable<Task<T>> tasks, Func<T, bool> predicate)
{
var taskList = tasks.ToList();
Task<T> completedTask = null;
do
{
completedTask = await Task.WhenAny(taskList);
taskList.Remove(completedTask);
} while (!predicate(await completedTask) && taskList.Any());
return completedTask == null ? default(T) : await completedTask;
}
그리고이 아래 전화 :
public async Task<string> methodname()
{
string sUrl = "https://abcd.com/test.php";
Task<string> task1 = DownLoadData(sUrl);
Task<string> task2 = DownLoadData(sUrl);
Task<string> task3 = DownLoadData(sUrl);
Task<string> task4 = DownLoadData(sUrl);
Task<string> task5 = DownLoadData(sUrl);
var tasks = new[] { task1, task2, task3, task4, task5 };
await WhenAny(tasks, t => t.Contains("First"));
return "";
}
을하지만 그렇지 충족 기준을. 제가 누락 된 부분을 제안하십시오. 어떤 도움을 주시면 감사하겠습니다.
왜 당신은 Task.WhenAny 재발견 했습니까? 그리고 "휴식을 취하다"는 것은 무엇을 의미합니까? 서버 자체가 이러한 API를 제공하지 않는 한 * HTTP 서버 *에 처리를 중지 할 수 없습니다. –
@PanagiotisKanavos 그렇지 않습니다. – Servy
@Servy 나는 그것을 지금 본다. 이 경우에는 불행한 메소드 이름 –