链式ContinueWith任务

3

我有两个任务的示例。当第一个任务完成后,第二个任务应该使用第一个任务的结果。由于我还是新手,希望有人能指导我如何链式执行它:

    public async Task<string> UploadFile(string containerName, IFormFile file)
    {
        //string blobPath = "";
        var container = GetContainer(containerName);
        var fileName = file.FileName;
        CloudBlockBlob blob = container.GetBlockBlobReference(fileName);
        using (var memoryStream = new MemoryStream())
        {
            // await file.CopyToAsync(memoryStream);
            // await blob.UploadFromStreamAsync(memoryStream);

            // upload only when the 'memoryStream' is ready 
            Task.Factory.StartNew(() => file.CopyToAsync(memoryStream))
                .ContinueWith(m => blob.UploadFromStreamAsync(m.Result)); // ??
        }
        return blob.Uri.AbsoluteUri;
    }

如果不是第二个变量:
public string UploadFile(string containerName, IFormFile file)
{
    var container = GetContainer(containerName);
    var fileName = file.FileName;
    CloudBlockBlob blob = container.GetBlockBlobReference(fileName);
    using (var memoryStream = new MemoryStream())
    {
        file.CopyToAsync(memoryStream).Wait();
        blob.UploadFromStreamAsync(memoryStream).Wait();

        //Task.Factory.StartNew(() => file.CopyToAsync(memoryStream))
        //    .ContinueWith(m => blob.UploadFromStreamAsync(m.Result)); // ??
    }
    return blob.Uri.AbsoluteUri;
}

3
请注意MemoryStream的生命周期,它将在您的第一个任务完成之前被处理。 - GhostTW
1个回答

3

IFormFile获取流并直接上传

public async Task<string> UploadFile(string containerName, IFormFile file)
{
    //string blobPath = "";
    var container = GetContainer(containerName);
    var fileName = file.FileName;
    CloudBlockBlob blob = container.GetBlockBlobReference(fileName);
    await blob.UploadFromStreamAsync(file.OpenReadStream())
    return blob.Uri.AbsoluteUri;
}

我的变体中运行良好,代码为 blob.UploadFromStreamAsync(file.OpenReadStream()).Wait(); 非常感谢,但是您能否解释一下如何在这种情况下使用 ContinueWith?以备将来之需。 - serge
2
@Serge,请不要混合使用async/await和阻塞调用(.Result.Wait()),否则会有死锁的风险。让代码始终异步流动。 - Nkosi
2
@Serge 大多数情况下,你不应该使用 ContinueWith。 - mason
@Serge 为什么你使用 .Wait() 而不是 await? - Dennis Kuypers
我不知道...我来自同步世界,所以不太啰嗦 :) 我会使用await,你是对的。我只是想知道是否有一些东西可以链接多个awaits.. - serge
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接