我正在将文件上传到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));
一切都很完美!
答案 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
。
您可能想要修改异常处理。你永远不会发现这种方法中的错误,因为所有异常都被抛弃了。