添加任务列表而不执行

时间:2015-12-04 06:42:59

标签: c# task

我有一个返回任务的方法,我想多次调用它并等待其中任何一个成功。我面临的问题是,只要我将任务添加到List,它就会执行,因为我添加了延迟来模拟工作,它只是阻止它。

有没有办法将这些任务添加到列表而不真正执行它,并让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);
   }
}

更新::下面的一个说清楚,我的印象是,如果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);
    } 
}

2 个答案:

答案 0 :(得分:2)

  

因为我添加了延迟来模拟工作,它只是阻止了

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

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

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

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

没有。 WhenAny永远不会执行任务。如初。

可以构建一个异步代理列表,即List<Func<Task>>并稍后执行它们,但我不认为这是你真正意义上的事情。寻找。

答案 1 :(得分:1)

Getdata方法中有多项任务。首先确实延迟,但是你返回完成的任务,返回10.试着像这样改变你的代码

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