c# - 即使调用 Task.WaitAll(task),异步上传到 Azure 也不会阻塞

标签 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));

一切都很完美!

最佳答案

这个人:

blob.UploadFromStreamAsync(image);

开始新任务。
因此这个人:

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

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

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

Task.WaitAll(task);

只会等待上传任务被触发(这会立即发生),但不会等待上传任务完成。

要解决这种情况,您必须编写:

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

关于c# - 即使调用 Task.WaitAll(task),异步上传到 Azure 也不会阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23818370/

相关文章:

Azure API管理: X-Forwarded-Host,获取原始主机

Azure Active Directory 和 owin 身份验证

java - 使用 Java 进行异步编程

.net 3.5 中的 c# MemoryMappedFile

C# - 多个服务器的 WMI 查询太慢

c# - 替换 NUnit 中的 Console.WriteLine

c# - .NET 程序集的延迟签名有什么意义?

asp.net - 如何通过上传.exe文件在Azure上托管控制台应用程序?

javascript - 将新元素附加到数组中的对象

c# - Visual Studio 在异步调用异常时中断,而不是陷入 Catch() 中