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