如何正确使用C#中的Async Await函数

时间:2018-03-07 21:32:52

标签: 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())
    {
       await itemFileUpload.MktRpt.CopyToAsync(stream);
       await _azureStorageService.saveBlob(stream, Path.GetFileName(itemFileUpload.MktRpt.FileName));
    }

    itemFileUpload.status = "Success";
    return View(itemFileUpload);
}

我的服务方法也很简单:

public async Task saveBlob(MemoryStream stream, string filename)
{
    var blockBlob = _container.GetBlockBlobReference(filename);
    await blockBlob.UploadFromStreamAsync(stream);
}

以及一个简单的模型类:

public class ManualMktRptFileUpload
{
    [Required]
    [Display(Name = "Manual Report")]
    public IFormFile MktRpt { get; set; }

    public string status { get; set; } = "Constructed";
}

当我在Azure中检查我的Blob容器时,该文件是BUT,它是零字节。

我认为这是因为我没有正确等待流转移,但我不知道如何修复它。

1 个答案:

答案 0 :(得分:4)

我怀疑这与async有什么关系。目前,您正在将一个流复制到MemoryStream,但随后会离开&#34;光标&#34;在MemoryStream的末尾...任何试图从中读取的内容都不会看到新数据。

修复非常简单:只是&#34;倒带&#34;在您调用saveBlob方法之前的流:

using (var stream = manager.GetStream())
{
   await itemFileUpload.MktRpt.CopyToAsync(stream);
   stream.Position = 0;
   await _azureStorageService.saveBlob(stream, Path.GetFileName(itemFileUpload.MktRpt.FileName));
}

或者,避免完全复制到MemoryStream

using (var stream = itemFileUpload.MktRpt.OpenReadStream())
{
    await _azureStorageService.saveBlob(stream, Path.GetFileName(itemFileUpload.MktRpt.FileName));
}