pas*_*ski 5 .net c# asynchronous task
我试图让这段代码以异步方式工作,但我有一些疑问。
public async Task<string> GetAsync(string inputA, string inputB)
{
var result = await AnotherGetAsync(inputA, inputB)
.ConfigureAwait(false);
return result.Enabled
? inputB
: string.Empty;
}
Run Code Online (Sandbox Code Playgroud)
我有一些字符串输入集合,我想对它们运行这个方法。然后我会做Task.WhenAll,并过滤非空字符串。
但它不会像我已经在等待结果的方法内部那样异步,对吗?
我认为真正的问题是:
如果在方法 A 内等待单个项目,如果我将其用于
Task.WhenAll调用方法 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);
}
Run Code Online (Sandbox Code Playgroud)
我的测试结果:
False
True
False
True
00:00:00.8006182
False
True
False
True
00:00:00.2017568
Run Code Online (Sandbox Code Playgroud)