【问题标题】:How do I use the Async Await functions in C# correctly如何正确使用 C# 中的 Async Await 函数
【发布时间】:2018-08-16 03:00:30
【问题描述】:

我仍然无法理解如何使用 Async 方法。我在控制器中有以下代码。

[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 容器时,文件在那里,但是它是零字节。

我相信这是因为我没有正确等待流传输,但我不知道如何解决它。

【问题讨论】:

标签: c# asp.net-mvc asynchronous async-await


【解决方案1】:

我怀疑这真的与异步有关。目前您正在将一个流复制到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));
}

或者,完全避免复制到MemoryStream

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

【讨论】:

  • 这成功了!感谢 Jon,很抱歉发布代码不符合约定。我昨天写得很快,没有校对就发回家了!不得不和我父母谈谈!
猜你喜欢
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多