即使调用Task.WaitAll(任务),异步上传到Azure也没有阻止

1 c# asynchronous blob task azure

我正在将文件上传到Azure.代码上传文件很好,但我的页面在最终确定之前刷新并显示旧图像.我可以手动刷新页面并显示新图像.为什么我的方法不等待任务完成?

    public static bool Upload(Stream image, String id)
    {
        try {
            var key = String.Format("{0}.png", id);

            image.Position = 0;

            var container = new CloudBlobContainer(new Uri(string.Format("{0}/{1}", Host, Container)), Credentials);

            var blob = container.GetBlockBlobReference(key);

            blob.Properties.ContentType = "image/png";

            Task task = Task.Run(() => { blob.UploadFromStreamAsync(image); });

            Task.WaitAll(task);
        }
        catch {
            return false;
        }

        return true;
    }
Run Code Online (Sandbox Code Playgroud)

答案:谢谢aleksey.berezan.事实证明答案甚至没有使用任务.

所以这:

Task task = Task.Run(() => { blob.UploadFromStreamAsync(image); });

Task.WaitAll(task);
Run Code Online (Sandbox Code Playgroud)

成为了这个:

Task.WaitAll(blob.UploadFromStreamAsync(image));
Run Code Online (Sandbox Code Playgroud)

一切都很完美!

ale*_*x.b 5

这家伙:

blob.UploadFromStreamAsync(image);
Run Code Online (Sandbox Code Playgroud)

开始新的任务.
因此这家伙:

Task.Run(() => { blob.UploadFromStreamAsync(image); });
Run Code Online (Sandbox Code Playgroud)

只是启动任务启动任务.这个代码:

Task task = Task.Run(() => { blob.UploadFromStreamAsync(image); });

Task.WaitAll(task);
Run Code Online (Sandbox Code Playgroud)

只会等到upload-task被触发(这会立即发生),但不会完成upload-task.

要解决这个问题你必须写:

Task.WaitAll(blob.UploadFromStreamAsync(image));
Run Code Online (Sandbox Code Playgroud)