添加任务列表而不执行
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
实际上,您的问题是您的代码正在调用 Wait
、which 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>>
并稍后执行它们,但我认为这不是您真正想要的。
我有一个方法 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
实际上,您的问题是您的代码正在调用 Wait
、which 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>>
并稍后执行它们,但我认为这不是您真正想要的。