【发布时间】:2017-10-16 15:18:23
【问题描述】:
Tpl Sample Click here to download
嗨, 我正在尝试在我的项目中实现 tpl。我使用 Web 客户端创建了 5 个并行 HTTP 调用。
我想要达到的目标。 如果 5 个并行调用中的任何一个返回包含 "First" 的字符串,则终止其余调用并继续调用返回 "First"。
我尝试过的:
我在上面附上了示例代码。我使用了以下谓词函数。
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 我现在明白了。在这种情况下不幸的方法名称
-
我需要检查 task.any 是否返回了特定的字符串。正如我提到的,如果任何任务返回“第一”,那么我需要删除休息并继续返回“第一”的任务。如果有任何替代解决方案,请提出建议。
-
@Panagiotis Kanavos 所说的杀戮是指从列表中删除剩余任务并仅返回相关任务结果。
标签: c# c#-4.0 async-await task-parallel-library webclient