只是一個簡單的問題。我們在這裏有一些誤解。等待Task.WhenAll vs ..select(async .. =>等待)
我們:
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);
可能有人照這一些額外的光?
歡呼聲。
新增: oke,所以它會同時運行。
然而,有人可以添加一些額外的信息不同的是,這些代碼段之間是什麼: https://dotnetfiddle.net/lzv2B7 https://dotnetfiddle.net/dMusus
(通知行16,async
和await
)。那兩個有什麼區別? 我會想到的是,與異步和等待它會直接啓動,如果沒有,那當談到Await Task.WhenAll(tasks);
添加clearity它會開始 - 這是我的代碼 - :
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') - 你得到答案馬上 – Fabio
這很容易測試:讓你的異步函數'Task.Delay'並測量需要多長時間。 – hvd
@fidor在我的日誌中,我看到了彼此之後的重複行,這表明它們是併發執行的。現在我正在打字,可能會有來自這裏的細線。 –