Azure存储Blob DownloadToStreamAsync WPF线程

时间:2013-12-30 23:41:42

标签: c# multithreading .net-4.5 async-await azure-storage

我正在尝试从Azure Blob存储中下载多个文件,以便在WPF中使用更新程序。我正在使用Storage Client 3.0版并尝试使用Async方法。我想下载文件并跟踪每个文件的进度,但是,DownloadToStreamAsync方法没有IProgress重载。另一个问题是文件继续下载(我知道这是因为我正在看文件在temp目录中增长),但应用程序的东西在它开始下载后立即完成。我是.NET中多线程的菜鸟,所以任何帮助都会受到赞赏。这是我的代码。

public async void Download()
{ 
    // Save blob contents to a file.
    using (FileStream fileStream = System.IO.File.OpenWrite(TempPath))
    {
        CloudBlockBlob blockBlob = Container.GetBlockBlobReference(BlobReference);    
        await blockBlob.DownloadToStreamAsync(fileStream);
    }
}

public void BeginDownload()
{
    Task task = new Task(Download);
    task.Start();
    task.Wait();
}

1 个答案:

答案 0 :(得分:2)

您不应该使用new Task()创建任务 您应该从Download方法中获取任务:

public async Task DownloadAsync()
{ 
    // Save blob contents to a file.
    using (FileStream fileStream = System.IO.File.OpenWrite(TempPath))
    {
        CloudBlockBlob blockBlob = Container.GetBlockBlobReference(BlobReference);    
        await blockBlob.DownloadToStreamAsync(fileStream);
    }
}
public async Task BeginDownloadAsync()
{
    await DownloadAsync();
}

当您调用async void方法时,您没有等待任务,因此在操作完成时无法收到通知。这就是它在操作完成之前“完成”的原因。 BeginDownload方法并没有真正等待它完成。