Tpl Sample Click here to download
Hi , I am trying to implement tpl in my project . where i have created 5 parallel HTTP call using web client .
What i am trying to achieve. If any of 5 parallel call return me string containing "First" Then kill rest call and continue with call returned "First" .
What i have tried :
I have attached sample code above. where i have used following Predicate function.
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;
}
And calling this as below:
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 "";
}
But it don't met criteria. Please suggest where i am missing something. Any help would be appreciated.