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

时间:2014-05-22 22:54:29

标签: c# azure asynchronous blob task

我正在将文件上传到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;
    }

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

所以这个:

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

Task.WaitAll(task);

成为这个:

Task.WaitAll(blob.UploadFromStreamAsync(image));

一切都很完美!

2 个答案:

答案 0 :(得分:5)

这家伙:

blob.UploadFromStreamAsync(image);

开始新任务。
因此,这家伙:

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

启动任务启动任务。所以这段代码:

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

Task.WaitAll(task);

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

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

Task.WaitAll(blob.UploadFromStreamAsync(image));

答案 1 :(得分:2)

您正在等待以Task.Run开始的任务。您想等待UploadFromStreamAsync。事实上,我不明白为什么你需要Task.Run。它只会使事情变慢。您将工作转移到线程池,然后等待它完成。

如果有同步版本UploadFromStreamAsync,请调用它。或者,在Wait返回的任务(不太可取)上调用UploadFromStreamAsync

您可能想要修改异常处理。你永远不会发现这种方法中的错误,因为所有异常都被抛弃了。