我试图让这段代码以异步方式工作,但我有一些疑问。
public async Task<string> GetAsync(string inputA, string inputB)
{
var result = await AnotherGetAsync(inputA, inputB)
.ConfigureAwait(false);
return result.Enabled
? inputB
: string.Empty;
}
我有一些字符串输入集合,我想在它们上运行这个方法。 然后我会执行 Task.WhenAll,并过滤非空字符串。
但它不会是异步的,因为我已经在等待结果了,对吗?
最佳答案
我认为真正的问题是:
If a single item is awaited inside method A, will this run sequential if I use
Task.WhenAll
for a range of items calling method A?
它们将与Task.WhenAll
同时运行。
也许最好用一个例子来解释:
void Main()
{
Test().GetAwaiter().GetResult();
}
private async Task<bool> CheckEmpty(string input)
{
await Task.Delay(200);
return String.IsNullOrEmpty(input);
}
private async Task Test()
{
var list = new List<string>
{
"1",
null,
"2",
""
};
var stopwatch = new Stopwatch();
stopwatch.Start();
// This takes aprox 4 * 200ms == 800ms to complete.
foreach (var itm in list)
{
Console.WriteLine(await CheckEmpty(itm));
}
Console.WriteLine(stopwatch.Elapsed);
Console.WriteLine();
stopwatch.Reset();
stopwatch.Start();
// This takes aprox 200ms to complete.
var tasks = list.Select(itm => CheckEmpty(itm));
var results = await Task.WhenAll(tasks); // Runs all at once.
Console.WriteLine(String.Join(Environment.NewLine, results));
Console.WriteLine(stopwatch.Elapsed);
}
我的测试结果:
False
True
False
True
00:00:00.8006182
False
True
False
True
00:00:00.2017568
关于C# Task WhenAll on 方法,该方法根据等待的调用返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59283334/