如何正确使用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));
}