C# 添加任务列表而不执行

C# 添加任务列表而不执行,c#,task,C#,Task,我有一个返回任务的方法,我想多次调用该任务,然后等待其中任何一个任务成功。我面临的问题是,一旦我将任务添加到列表中,它就会执行,而且因为我添加了延迟来模拟工作,它就在那里阻塞了 有没有一种方法可以将任务添加到列表中,而不必真正执行它,也不必让任何人执行任务 下面的代码来自Linqpad编辑器 async void Main() { var t = new Test(); List<Task<int>> tasks = new List<Task&l

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

有没有一种方法可以将任务添加到列表中,而不必真正执行它,也不必让任何人执行任务

下面的代码来自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);
    } 
}

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

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

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

return Task.Delay(90000).ContinueWith(t => 10)
因为我添加了延迟来模拟工作,所以它只是阻塞在那里

实际上,您的问题是您的代码正在调用Wait,直到延迟完成

要正确使用Task.Delay,应使用Wait:

有没有一种方法可以将任务添加到列表中,而不必真正执行它,也不必让任何人执行任务

不,当他们从不执行任务时。永远

可以构建一个异步委托列表,也就是一个列表,稍后再执行它们,但我认为这不是您真正想要的

因为我添加了延迟来模拟工作,所以它只是阻塞在那里

实际上,您的问题是您的代码正在调用Wait,直到延迟完成

要正确使用Task.Delay,应使用Wait:

有没有一种方法可以将任务添加到列表中,而不必真正执行它,也不必让任何人执行任务

不,当他们从不执行任务时。永远


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

延迟不是问题,我补充了这一点,以查看我是否调用t.GetData,它实际上是一个阻塞调用。GetData不是一个异步方法,必须执行它才能返回任务对象或任何其他对象。如果您不想执行它,请重写Getdata方法以返回纯int,然后调用tasks.Addnew Task=>Getdata。或者Task.Factory.StartNew=>Getdata,如果您想开始执行,但不阻止当前线程。延迟不是问题所在,我补充说,为了查看调用t.Getdata是否实际上是阻止调用。Getdata不是异步方法,必须执行它才能返回任务对象或任何其他对象。如果您不想执行它,请重写Getdata方法以返回纯int,然后调用tasks.Addnew Task=>Getdata。或者Task.Factory.StartNew=>Getdata,如果你想开始执行,但不阻止当前线程。谢谢你的回复,我已经读了你的书。Task.Delay只是为了模拟工作,我本可以使用Thread.Sleep,但我的观点是-例如,如果Getdata方法正在通过网络获取一些数据,那么当我将任务添加到列表中时,它实际上会等待网络调用完成吗?我不能等待单独的getData调用,我只想将它们添加到列表中,让其中一个完成并获得结果。任务在其异步方法完成时完成。所以,当Getdata完成时,它返回的任务将完成。我想我得到了答案,我想这一条说明得很清楚。谢谢你的回复,我已经读了你的书。Task.Delay只是为了模拟工作,我本可以使用Thread.Sleep,但我的观点是-例如,如果Getdata方法正在通过网络获取一些数据,那么当我将任务添加到列表中时,它实际上会等待网络调用完成吗?我不能等待单独的getData调用,我只想将它们添加到列表中,让其中一个完成并获得结果。任务在其异步方法完成时完成。因此,当Getdata完成时,它返回的任务将完成。我想我得到了答案,我想这一点非常清楚。