Tpl Sample Click here to downloadTPL实现问题
嗨, 我想实现我的项目中第三方物流。我使用Web客户端创建了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?你是什么意思“杀死休息”?你不能告诉* HTTP服务器*停止处理,除非服务器本身提供这样的API –
@PanagiotisKanavos他们没有。 – Servy
@Servy现在我明白了。在这种情况下,不幸的方法名称 –