1 c# asynchronous blob task azure
我正在将文件上传到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;
}
Run Code Online (Sandbox Code Playgroud)
答案:谢谢aleksey.berezan.事实证明答案甚至没有使用任务.
所以这:
Task task = Task.Run(() => { blob.UploadFromStreamAsync(image); });
Task.WaitAll(task);
Run Code Online (Sandbox Code Playgroud)
成为了这个:
Task.WaitAll(blob.UploadFromStreamAsync(image));
Run Code Online (Sandbox Code Playgroud)
一切都很完美!
这家伙:
blob.UploadFromStreamAsync(image);
Run Code Online (Sandbox Code Playgroud)
开始新的任务.
因此这家伙:
Task.Run(() => { blob.UploadFromStreamAsync(image); });
Run Code Online (Sandbox Code Playgroud)
只是启动任务启动任务.这个代码:
Task task = Task.Run(() => { blob.UploadFromStreamAsync(image); });
Task.WaitAll(task);
Run Code Online (Sandbox Code Playgroud)
只会等到upload-task被触发(这会立即发生),但不会完成upload-task.
要解决这个问题你必须写:
Task.WaitAll(blob.UploadFromStreamAsync(image));
Run Code Online (Sandbox Code Playgroud)