尝试将 Task.WhenAll 与 Task<string> 一起使用无效
Trying to use Task.WhenAll with Task<string> not working
我正在尝试将多个资源合并到一个集合中(下面的 s 变量)。 GetLocations2 returns 一个任务,我希望能够将其添加到任务结果集合(同样是 s 变量)。但是,由于以下错误,它抱怨我无法将任务结果添加到集合中:
Error CS1503 Argument 1: cannot convert from 'string' to
'System.Threading.Tasks.Task'
打电话
public static async Task<string> WebRequest2(Uri uri)
{
using (var client = new WebClient())
{
var result = await client.OpenReadTaskAsync(uri).ConfigureAwait(false);
using (var sr = new StreamReader(result))
{
return sr.ReadToEnd();
}
}
}
来电者
private static async Task GetLocations2()
{
var s = new List<Task<string>>();
foreach (var lob in _lobs)
{
var r = await Helper.WebRequest2(new Uri(lob));
var x = Helper.DeserializeResponse<SLICS>(r);
s.Add(r); //Getting red squiggly here
}
//var w = await Task.WhenAll();
}
在将任务添加到列表之前不需要 await
,它基本上解包由 Helper.WebRequest2
创建的 Task
(它还等待 Task
完成,所以原始代码中的任务将按顺序执行):
private static async Task GetLocations2()
{
var s = new List<Task<string>>();
foreach (var lob in _lobs)
{
var r = Helper.WebRequest2(new Uri(lob));
// var x = Helper.DeserializeResponse<SLICS>(r); this should be done after Task.WhenAll
// or using `ContinueWith`
s.Add(r);
}
var w = await Task.WhenAll(s);
}
您还可以将这两个操作包装在一个 async
lambda 中以避免必须迭代两次:
private static async Task GetLocations2()
{
IEnumerable<SLICS> w = await Task.WhenAll(_lobs.Select(async lob =>
{
var r = await Helper.WebRequest2(new Uri(lob));
return Helper.DeserializeResponse<SLICS>(r);
}));
}
使用 Select
将枚举所有由 lambda 表达式返回的 Tasks
,然后 Task.WhenAll
将等待它们全部完成,然后解包结果。
我正在尝试将多个资源合并到一个集合中(下面的 s 变量)。 GetLocations2 returns 一个任务,我希望能够将其添加到任务结果集合(同样是 s 变量)。但是,由于以下错误,它抱怨我无法将任务结果添加到集合中:
Error CS1503 Argument 1: cannot convert from 'string' to 'System.Threading.Tasks.Task'
打电话
public static async Task<string> WebRequest2(Uri uri)
{
using (var client = new WebClient())
{
var result = await client.OpenReadTaskAsync(uri).ConfigureAwait(false);
using (var sr = new StreamReader(result))
{
return sr.ReadToEnd();
}
}
}
来电者
private static async Task GetLocations2()
{
var s = new List<Task<string>>();
foreach (var lob in _lobs)
{
var r = await Helper.WebRequest2(new Uri(lob));
var x = Helper.DeserializeResponse<SLICS>(r);
s.Add(r); //Getting red squiggly here
}
//var w = await Task.WhenAll();
}
在将任务添加到列表之前不需要 await
,它基本上解包由 Helper.WebRequest2
创建的 Task
(它还等待 Task
完成,所以原始代码中的任务将按顺序执行):
private static async Task GetLocations2()
{
var s = new List<Task<string>>();
foreach (var lob in _lobs)
{
var r = Helper.WebRequest2(new Uri(lob));
// var x = Helper.DeserializeResponse<SLICS>(r); this should be done after Task.WhenAll
// or using `ContinueWith`
s.Add(r);
}
var w = await Task.WhenAll(s);
}
您还可以将这两个操作包装在一个 async
lambda 中以避免必须迭代两次:
private static async Task GetLocations2()
{
IEnumerable<SLICS> w = await Task.WhenAll(_lobs.Select(async lob =>
{
var r = await Helper.WebRequest2(new Uri(lob));
return Helper.DeserializeResponse<SLICS>(r);
}));
}
使用 Select
将枚举所有由 lambda 表达式返回的 Tasks
,然后 Task.WhenAll
将等待它们全部完成,然后解包结果。