Tpl Sample Click here to downloadTPLの実装の問題
こんにちは、 私は自分のプロジェクトにTPLを実装しようとしています。私は5つのパラレルHTTP呼び出しをWebクライアントを使用して作成しました。
私が達成しようとしていること。 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を改革しましたか?そして、 "休息を取る"ということは何を意味しますか?サーバ自体がそのようなAPIを提供していない限り、* HTTPサーバ*に処理を停止させることはできません。 –
@PanagiotisKanavos彼らはしませんでした。 – Servy
@サーヴィー私は今それを見る。この場合の不幸なメソッド名 –