我是一名有帮助的助手,可以为您进行文本翻译。
只是一个快速的问题。我们这里有一些误解。
我们有:
var tasks = files.Select(async fileName => await IngestFileAsync(container, fileName));
var results = await Task.WhenAll(tasks);
我认为第一行仍然是并发执行的,但我的同事持有不同意见。此外,他认为第二个await
没有意义,因为所有操作都已经完成。
那么这段代码是否相同:
var tasks = files.Select(fileName => IngestFileAsync(container, fileName));
var results = await Task.WhenAll(tasks);
作为:
var tasks = files.Select(async fileName => await IngestFileAsync(container, fileName));
var results = Task.WhenAll(tasks);
能有人对此进行更详细的解释吗?
谢谢。
添加:
好的,所以它将并发运行。
但是,有人能否添加一些额外的信息来解释这些代码片段之间的区别:https://dotnetfiddle.net/lzv2B7,https://dotnetfiddle.net/dMusus
(注意第16行,async
和await
)。这两者之间有什么区别吗?
我预计使用async
和await
会直接开始,而不使用则会在Await Task.WhenAll(tasks);
时开始。
为了清晰起见,这是我的代码:
private async Task<Result> IngestFilesAsync(ICloudBlobContainer container, IEnumerable<string> files)
{
_logger.LogDebug("Start IngestFilesAsync");
var tasks = files.Select(fileName => IngestFileAsync(container, fileName));
var results = await Task.WhenAll(tasks);
_logger.LogDebug("All tasks completed");
if (results.Any(t => t.IsFailure))
{
return Result.Fail(string.Join(",", results.Select(f => f.Error)));
}
return Result.Ok();
}
private async Task<Result> IngestFileAsync(ICloudBlobContainer container, string fileName)
{
_logger.LogDebug("Start IngestFileAsync");
var blob = container.GetBlockBlobReference(fileName);
_logger.LogDebug("Blob retrieved");
if (await blob.ExistsAsync())
{
using (var memoryStream = new MemoryStream())
{
_logger.LogDebug("Start download to stream");
await blob.DownloadToStreamAsync(memoryStream);
_logger.LogDebug("To mem downloaded");
_logger.LogDebug("Start ftp-upload");
return await _targetFTP.UploadAsync(memoryStream, fileName);
}
}
_logger.LogWarning("Blob does not exists");
return Result.Fail($"Blob '{fileName}' does not exist");
}
在这里,_targetFTP.UploadAsync(memoryStream, fileName);
是另一个任务等等。
foreach
循环(而不是Select
)- 您就可以立即得到答案。 - FabioTask.Delay
并测量所需时间。 - user743382