添加任务列表而不执行

Adding List of tasks without executing

我有一个方法 returns 一个任务,我想多次调用它并等待其中任何一个成功。我面临的问题是,一旦我将任务添加到列表中,它就会执行,并且由于我添加了延迟来模拟工作,它只是阻塞在那里。

有没有办法将任务添加到列表中而不真正执行它并让 whenAny 执行任务。

以下代码来自Linqpad编辑器。

async void  Main()
{
    var t = new Test();
    List<Task<int>> tasks = new List<Task<int>>();

    for( int i =0; i <  5; i++)
    {
        tasks.Add(t.Getdata());
    }

    var result = await Task.WhenAny(tasks);

    result.Dump();
}

public class Test
{
   public Task<int> Getdata()
   {
      "In Getdata method".Dump();
      Task.Delay(90000).Wait();
      return Task.FromResult(10);
   }
}

Update :: 下面说得很清楚,我的印象是如果 GetData 调用网络,它会在实际完成期间被阻塞。

async void Main()
{
 OverNetwork t = new OverNetwork();
 List<Task<string>> websitesContentTask = new List<Task<string>>();
 websitesContentTask.Add(t.GetData("http://www.linqpad.net"));
 websitesContentTask.Add(t.GetData("http://csharpindepth.com"));
 websitesContentTask.Add(t.GetData("http://www.albahari.com/nutshell/"));
 Task<string> completedTask = await Task.WhenAny(websitesContentTask);
 string output = await completedTask;
 Console.WriteLine(output);
}

public class OverNetwork
{
    private HttpClient client = new HttpClient();

    public Task<string> GetData(string uri)
    {
        return client.GetStringAsync(uri);
    } 
}

您的 Getdata 方法中有多个任务。首先确实延迟,但您正在返回返回 10 的已完成任务。尝试像这样更改您的代码

return Task.Delay(90000).ContinueWith(t => 10)

since I added delay to simulate the work, it just block there

实际上,您的问题是您的代码正在调用 Waitwhich blocks the current thread,直到延迟完成。

要正确使用 Task.Delay,您应该使用 await:

public async Task<int> Getdata()
{
  "In Getdata method".Dump();
  await Task.Delay(90000);
  return 10;
}

Is there a way to add the the tasks to the list without really executing it and let whenAny execute the tasks.

没有。 WhenAny 从不执行任务。曾经。

可以构建一个异步委托列表,即 List<Func<Task>> 并稍后执行它们,但我认为这不是您真正想要的。