【问题标题】:How to call async Task<List<>> class in another class?如何在另一个类中调用异步 Task<List<>> 类?
【发布时间】:2022-01-05 20:28:20
【问题描述】:

我有这个方法

public async Task<List<InvoiceVAT>> Import(IFormFile file)
{
    var list = new List<InvoiceVAT>();
    using (var stream = new MemoryStream())
    {
        await file.CopyToAsync(stream);
        using (var package = new ExcelPackage(stream))
        {
        }
    }
    return list;
}

但在尝试调用它时收到以下错误:

没有给出与所需形式参数相对应的参数

还有一个警告:

因为没有等待这个调用,所以在调用完成之前会继续执行当前方法

我哪里错了?

【问题讨论】:

  • 这不是一个类——它是一个方法,它可能在也可能不在一个类中。还有,什么错误?
  • 哦,对不起,我的意思是方法。错误是“没有给出与所需的形式参数相对应的参数”和“由于不等待此调用,因此在调用完成之前继续执行当前方法。”
  • @TiaraDwiDikiyanti 如果您展示了尝试调用Import 的代码,这将很有用。
  • “出现错误” - 什么错误?向我们展示出错的代码。向我们提供有关如何运行代码并自己查看错误的完整说明。实际上,关于此错误的minimal reproducible example 不会包含您的Import 方法的内容——它只需要一个基本的shell——但我们需要它周围的一切。

标签: c# asp.net async-await


【解决方案1】:

第一个错误“没有给出与所需形参对应的参数”,表示您没有提供 Import() 方法所需的 IFormFile 参数。

第二个,“因为没有等待这个调用,所以在调用完成之前继续执行当前方法。”,因为 Import() 被定义为异步方法并且应该等待对它的调用而引发. 这意味着调用者方法也是异步的,其中 Import() 应该像这样调用:

IFormFile formFile; //Assuming formFile is initiated or provided.
var invoiceVATs = await Import(formFile); //Assuming this is an instance method within the same class as Import()

或者需要同步获取异步方法的Result(阻塞调用者方法,等待异步方法完成),不推荐这样做:

IFormFile formFile; //Assuming formFile is initiated or provided.
var invoiceVATs = Import(formFile).Result; //Assuming this is an instance method within the same class as Import()

如果您想了解更多关于异步编程的信息,这里有一个很棒的资料:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/

【讨论】:

  • 另一种选择是将formfile 设为可选,并在未通过时设置默认值 - 最终取决于那里的用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多