我应该如何从控制器到接口进行异步调用



我有一个接口:

public IEnumerable<statisticsDaily> statsMonthly(string id, string dtFrom, string dtTo)
{
var rslt =  ( from d in db.statMonth
join s in db.masterData on d.m_turbine_id equals s.m_turbine_id
where d.m_turbine_id == IPAddress.Parse(id) && d.m_date >= frm
group d by d.m_date.Month into g
select new statisticsDaily
{
Date = g.Key.ToString("MMM"),
Production = g.Sum(s => s.m_energy_prod),
m_wind_speed = g.Average(s => s.m_wind_speed),
Availability = g.Average(s => s.m_availability)
}
).AsEnumerable(); 
return rslt;

}

我有一个应该执行异步调用的控制器:

public async Task StaticsMonthly(string id, string from, string to)
{
_statdaily.statsMonthly(id, startDate.ToString(), now.ToString()));
return Ok( result);
}

这给了我一个错误严重性代码
error CIEnumerable"不包含"GetAwaiter"的定义,并且找不到接受类型为"IEnumerable"的第一个参数的可访问扩展方法"GetAwaite"(是否缺少using指令或程序集引用?(

您需要使您的操作方法同步,因为它不执行任何异步工作,也不返回导致异常的Task对象

这应该工作

public IActionResult StaticsMonthly(string id, string from, string to)
{
_statdaily.statsMonthly(id, startDate.ToString(), now.ToString()));
return Ok( result);
}

让statsMonthly函数返回一个任务:

public async<Task<IEnumerable<statisticsDaily>>> statsMonthly(string id, string dtFrom, string dtTo)
{
var rslt = await ( from d in db.statMonth
join s in db.masterData on d.m_turbine_id equals s.m_turbine_id
where d.m_turbine_id == IPAddress.Parse(id) && d.m_date >= frm
group d by d.m_date.Month into g
select new statisticsDaily
{
Date = g.Key.ToString("MMM"),
Production = g.Sum(s => s.m_energy_prod),
m_wind_speed = g.Average(s => s.m_wind_speed),
Availability = g.Average(s => s.m_availability)
}
).ToListAsync(); 
return rslt;

}

然后是您的控制器等待功能:

public async Task StaticsMonthly(string id, string from, string to)
{
var results = await _statdaily.statsMonthly(id, startDate.ToString(), now.ToString()));
return Ok( result);
}

最新更新