C# 异步上传到Azure isn';即使调用Task.WaitAll(Task),也不会阻塞

C# 异步上传到Azure isn';即使调用Task.WaitAll(Task),也不会阻塞,c#,azure,asynchronous,blob,task,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;

我正在将一个文件上载到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));

一切都很完美

您正在等待以
任务开始的任务。运行
。您想等待
从StreamAsync上传
。事实上,我不明白为什么需要
任务。在这里运行
。这只会让事情变得更慢。将工作转移到线程池,然后等待它完成

如果有同步版本,只需调用UploadFromStreamAsync的同步版本即可。或者,对
UploadFromStreamAsync
返回的任务调用
Wait
(不太可取)


您可能需要修改异常处理。您将永远无法发现此方法中的错误,因为所有异常都将被丢弃。

您正在等待从
任务开始的任务。运行
。您想等待
从StreamAsync上传
。事实上,我不明白为什么需要
任务。在这里运行
。这只会让事情变得更慢。将工作转移到线程池,然后等待它完成

如果有同步版本,只需调用UploadFromStreamAsync的同步版本即可。或者,对
UploadFromStreamAsync
返回的任务调用
Wait
(不太可取)

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

这个家伙:

blob.UploadFromStreamAsync(image);
开始新任务。
因此,这家伙:

Task.Run(() => { blob.UploadFromStreamAsync(image); });
刚开始的任务就开始了。因此,该代码:

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


offtop:
catch{return false;}
-请在家中尝试,但不要在工作中尝试。如何调用
Upload
方法?你能把你的网页的代码贴出来吗?是的,最重要的是速记。我还没有完全实现错误处理。这个调用只是一个基本的静态调用。DataStorageUtility.Upload(data.Image.InputStream,id);如果直接调用
blob.UploadFromStreamAsync(图像),而不是
Task
,它是否有效?谢谢aleksey.berezan!那很好用。把这个写下来作为答案,我会把它标记为已回答。offtop:
catch{return false;}
-一定要在家里试一下,但不要在工作中试一下。你怎么称呼
上传
方法?你能把你的网页的代码贴出来吗?是的,最重要的是速记。我还没有完全实现错误处理。这个调用只是一个基本的静态调用。DataStorageUtility.Upload(data.Image.InputStream,id);如果直接调用
blob.UploadFromStreamAsync(图像),而不是
Task
,它是否有效?谢谢aleksey.berezan!那很好用。把这个写下来作为答案,我会为你标记为已回答。异常处理只是一个临时交易。我还没有完全实现这个方法。仅仅调用UploadFromStreamAsync也不起作用。但是调用Task.WaitAll(UploadFromStreamAsync)最终还是可以工作的。您最好直接调用同步版本。如果不可能,则对任务调用
Wait
,而不是调用
task.WaitAll
,这是不必要的复杂操作。异常处理只是临时处理。我还没有完全实现这个方法。仅仅调用UploadFromStreamAsync也不起作用。但是调用Task.WaitAll(UploadFromStreamAsync)最终还是可以工作的。您最好直接调用同步版本。如果不可能,则对任务调用
Wait
,而不是调用
task.WaitAll
,这是不必要的复杂。问题是:调用
task.WaitAll(blob.UploadFromStreamAsync(stream))
与同步调用
blob.UploadFromStream(stream)
相比,实际上有什么区别吗?我的意思是因为我们正在当前线程中等待另一个线程完成。。。所以当前线程并没有被释放到线程池中,因为在这段代码中并没有异步/等待。。。在我的机器上(win8/net45/x64),这个家伙
blob.UploadFromStream(image)在当前线程中运行,但这一个
Task.WaitAll(blob.UploadFromStreamAsync(image))在不同线程中运行操作,并在当前线程中等待完成。因此,在这两种情况下,当前线程在操作完成之前都很忙,但在第二种情况下,实际操作需要额外的一个线程。从您所说的,我可以推断,
UploadFromStream
更快,使用的资源更少。在这两种情况下,因为它不必创建新线程。只是一个问题:如果调用
Task.WaitAll(blob.UploadFromStreamAsync(stream))
与同步调用
blob.UploadFromStream(stream)
,实际上有什么区别吗?我的意思是因为我们正在当前线程中等待另一个线程完成。。。所以当前线程并没有被释放到线程池中,因为在这段代码中并没有异步/等待。。。在我的机器上(win8/net45/x64),这个家伙
blob.UploadFromStream(image)在当前线程中运行,但这一个
Task.WaitAll(blob.UploadFromStreamAsync(image))在不同线程中运行操作并在cur中等待