我有一个返回任务的方法,我想多次调用它并等待其中任何一个成功。我面临的问题是,只要我将任务添加到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);
}
}
答案 0 :(得分:2)
因为我添加了延迟来模拟工作,它只是阻止了
实际上,您的问题是您的代码正在调用Wait
,which 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)