ただの質問です。私たちはここでいくつかの誤解をしています。はTask.WhenAll対選択を待っています(async .. =>待っています)
我々が持っている:
var tasks = files.Select(async fileName => await IngestFileAsync(container, fileName));
var results = await Task.WhenAll(tasks);
私は、最初の行がまだ同時行くことを言うが、私の仲間の同僚は、それ以外の場合は言います。また、 のアクションはすべて既に実行されているため、2番目の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
):
しかし、誰かが差はこれらのコードスニペットの間でどのようないくつかの余分な情報を追加することができます。それら2の間に違いはありますか?
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");
}
:これは私のコード - ある - 私は期待する何 は非同期で
、それはそれはAwait Task.WhenAll(tasks);
に来るとき、それが開始されることを、直接起動、およびなしでしょう待つがclearityのために追加したことです
ここで、_targetFTP.UploadAsync(memoryStream, fileName);
は再びタスクなどです。
両方のケースを 'foreach'ループ(' Select'の代わりに)として書き直してください。 – Fabio
これはテストするのが簡単です:非同期関数 'Task.Delay'を作り、それがどれくらい時間がかかるかを測定します。 – hvd
私のログには@fidorがあります。私は互いに重複した行を見ています。それは、それらが同時に実行されたことを示唆しています。今、私はそれを入力している、それは可能性がありますここに来るかもしれないスレッドがあった。 –