如何正确使用C#中的异步等待函数
我仍然无法理解如何使用异步方法。我在控制器中有以下代码如何正确使用C#中的异步等待函数,c#,asp.net-mvc,asynchronous,async-await,C#,Asp.net Mvc,Asynchronous,Async Await,我仍然无法理解如何使用异步方法。我在控制器中有以下代码 [HttpPost] public async Task<IActionResult> ManualUpload([Bind("MktRpt")] ManualMktRptFileUpload itemFileUpload) { var manager = new RecyclableMemoryStreamManager(); using (var stream = manager.GetStream())
[HttpPost]
public async Task<IActionResult> ManualUpload([Bind("MktRpt")] ManualMktRptFileUpload itemFileUpload)
{
var manager = new RecyclableMemoryStreamManager();
using (var stream = manager.GetStream())
{
await itemFileUpload.MktRpt.CopyToAsync(stream);
await _azureStorageService.saveBlob(stream, Path.GetFileName(itemFileUpload.MktRpt.FileName));
}
itemFileUpload.status = "Success";
return View(itemFileUpload);
}
以及一个简单的模型类:
public class ManualMktRptFileUpload
{
[Required]
[Display(Name = "Manual Report")]
public IFormFile MktRpt { get; set; }
public string status { get; set; } = "Constructed";
}
当我在Azure中检查Blob容器时,文件在那里,但它是零字节
我相信这是因为我没有正确地等待流传输,但我不知道如何修复它。我怀疑这是否真的与异步有关。当前,您正在将一个流复制到
MemoryStream
,但随后将“光标”留在MemoryStream
的末尾。。。任何试图从中读取的内容都不会看到新数据
解决方法非常简单:在调用saveBlob
方法之前,只需“倒带”流即可:
using (var stream = manager.GetStream())
{
await itemFileUpload.MktRpt.CopyToAsync(stream);
stream.Position = 0;
await _azureStorageService.saveBlob(stream, Path.GetFileName(itemFileUpload.MktRpt.FileName));
}
或者,完全避免复制到内存流中
:
using (var stream = itemFileUpload.MktRpt.OpenReadStream())
{
await _azureStorageService.saveBlob(stream, Path.GetFileName(itemFileUpload.MktRpt.FileName));
}
另一方面,我会开始遵循.NET命名约定——
Status
而不是Status
,SaveBlobAsync
而不是saveBlob
,等等。这就成功了!谢谢Jon,很抱歉发布的代码不符合惯例。我昨天写得很快,在我贴出去回家之前没有校对过!我得跟我父母谈谈!
using (var stream = itemFileUpload.MktRpt.OpenReadStream())
{
await _azureStorageService.saveBlob(stream, Path.GetFileName(itemFileUpload.MktRpt.FileName));
}