C#中异步方法的返回类型
Posted
技术标签:
【中文标题】C#中异步方法的返回类型【英文标题】:Return Type for Async Method in C# 【发布时间】:2019-04-05 08:23:41 【问题描述】:我正在编写一个删除员工贷款计划的方法。这意味着我必须删除作为列表的结果集。我读到 List.Clear() 可以删除列表。我有一个来自接口的自定义方法 repository,它是异步的并返回 IEnumerable 。我遇到的问题是删除列表后异步方法的返回类型。错误是get is
方法“Task.FromResult(TResult)”的类型参数无法从用法中推断出来。尝试明确指定类型参数。
public Task<bool> DeleteEmployeeSchedule(string employeeId, string loantypecode)
var scheduleList = _repository.FindBy(e => e.EmployeeId == employeeId && e.LoanTypeCode == loantypecode).Result.ToList();
scheduleList.Clear()
return Task.FromResult();
大家好,我再次更改了代码。这次列表中的项目没有被删除。这是否意味着 RemoveAll() 不会从数据库中删除记录。下面的代码不会删除记录。
public async Task<bool> DeleteEmployeeSchedule(string employeeId, string loantypecode)
var scheduleList = _repository.FindBy(e => e.EmployeeId == employeeId && e.LoanTypeCode == loantypecode).Result.ToList();
scheduleList.RemoveAll(employee => employee.EmployeeId == employeeId);
await _repository.DbContext.SaveChangesAsync();
return true;
【问题讨论】:
没有人从不阅读异常消息。 无法从用法推断方法“Task.FromResult(TResult)”的类型参数意味着编译器无法从用法推断方法“Task.FromResult(TResult)”的类型参数。 你的Task.FromResult()
没有参数,它必须有bool
类型的参数。你怎么能从scheduleList
返回bool
?
List.Clear()
只会清除List
的内容。它不会从源_repository
中删除记录。您的代码正在创建一个新列表,然后将其清除,但它没有进行任何有意义的更改。
使用 removerange 或 remove all 怎么样?
@lutakyn,你能展示你的存储库吗?
【参考方案1】:
您有一些语法错误,您缺少Task.FromResult();
的参数,传入布尔值将回答您的问题。
将您的行更改为:return Task.FromResult(true);
将修复您的错误消息。
此外,您可以重构调用以使用 `await:
public async Task<bool> DeleteEmployeeSchedule(string employeeId, string loantypecode)
var scheduleList = (await _repository.FindBy(e => e.EmployeeId == employeeId && e.LoanTypeCode == loantypecode).ToList();
scheduleList.Clear()
//NOTE: however your error occurred on the line below due to wrong syntax, you have to pass in a boolean value eg. true/false
return Task.FromResult(true);
编辑:
在没有看到更多代码的情况下,例如您的_repository
是什么数据类型以及它是如何实现的,我们不得不假设太多的事情......
正如其中一个 cmets 所述,这不会持久存在于数据库中。
EDIT2: @lutakyn 将以下代码更改作为评论发布 (请使用更新后的代码更新您的初始帖子)
public async Task<bool> DeleteEmployeeSchedule(string employeeId, string loantypecode)
var scheduleList = (await _repository.FindBy(e => e.EmployeeId == employeeId && e.LoanTypeCode == loantypecode)).ToList();
scheduleList.RemoveAll(employee => employee.EmployeeId == employeeId);
await _repository.DbContext.SaveChangesAsync();
return true;
scheduleList
包含符合您的条件的实体,从该列表中删除它们或调用 .Clear()
不会影响 DbContext 中的实体。您必须在您的 DbContext 上调用删除,例如:
_repository.DbContext.Schedule.RemoveRange(scheduleList);
但是 .Schedule
是一个假设,因为我们不知道您的 _repository 是什么样子,.DbContext
究竟是什么数据类型以及您的 DbSet<>
在您的 DbContext
实现中是什么。
【讨论】:
“确实会删除”——不,不会。 @Enigmativity 您看不到返回类型,无法保证它是 System.Collections.Generic.ListIEnumerable<T>
和LINQ .ToList()
扩展返回List<T>
,所以Clear()
什么都不做。
@vasily.sib 足够公平
@Tomek,您能否从问题中添加一个更正的代码(带有async/await
),以防将来有人会以某种方式找到这个问题?以上是关于C#中异步方法的返回类型的主要内容,如果未能解决你的问题,请参考以下文章