C# 如果满足条件,如何停止运行任务列表
我正在发出大量的客户端get请求,下面的代码工作正常,但如何在找到HttpResponseMessage of StatusCode.OK并返回单个任务后强制停止执行C# 如果满足条件,如何停止运行任务列表,c#,task,C#,Task,我正在发出大量的客户端get请求,下面的代码工作正常,但如何在找到HttpResponseMessage of StatusCode.OK并返回单个任务后强制停止执行 public List<Task<HttpResponseMessage>> GetUploadURLAsync(List<string> list) { List<Task<HttpResponseMessage>> task
public List<Task<HttpResponseMessage>> GetUploadURLAsync(List<string> list)
{
List<Task<HttpResponseMessage>> tasks = new List<Task<HttpResponseMessage>>();
using (HttpClient client = new HttpClient())
{
for(int i = 0; i < list.Count; i++)
{
<client get async code generating task list>
}
Task.WaitAll(tasks.ToArray());
}
return tasks;
}
公共列表GetUploadURLAsync(列表列表)
{
列表任务=新列表();
使用(HttpClient=new HttpClient())
{
for(int i=0;iclass SomeClass
{
private static HttpClient _httpClient = new HttpClient();
public static Task<HttpResponseMessage> GetFirstSuccessAsync(List<string> list)
{
var tasks = new List<Task<HttpResponseMessage>>();
foreach (var url in list) {
tasks.Add(_httpClient.GetAsync(url));
}
return WhenAnySuccess(tasks);
}
private static async Task<HttpResponseMessage> WhenAnySuccess(List<Task<HttpResponseMessage>> tasks)
{
while (tasks.Count > 0) {
Task<HttpResponseMessage> task = await Task.WhenAny(tasks);
if (task.Status == TaskStatus.RanToCompletion && task.Result.StatusCode == HttpStatusCode.OK) {
return task.Result;
}
tasks.Remove(task);
}
return null;
}
}
class Program
{
static void Main(string[] args)
{
var response = SomeClass.GetFirstSuccess(new List<string> { "http://google.com", "http://microsoft.com" }).Result;
Console.WriteLine(response.RequestMessage.RequestUri);
Console.ReadKey();
}
}
class-SomeClass
{
私有静态HttpClient _HttpClient=新HttpClient();
公共静态任务GetFirstSuccessAsync(列表)
{
var tasks=新列表();
foreach(列表中的变量url){
添加(_httpClient.GetAsync(url));
}
返回成功(任务);
}
私有静态异步任务成功(列出任务)
{
而(tasks.Count>0){
任务=等待任务。当有(任务);
if(task.Status==TaskStatus.RanToCompletion&&task.Result.StatusCode==HttpStatusCode.OK){
返回任务。结果;
}
任务。删除(任务);
}
返回null;
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var response=SomeClass.GetFirstSuccess(新列表{”http://google.com", "http://microsoft.com“})结果;
WriteLine(response.RequestMessage.RequestUri);
Console.ReadKey();
}
}
这里提到了几个选项: