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&lt;&gt; 在您的 DbContext 实现中是什么。

【讨论】:

“确实会删除”——不,不会。 @Enigmativity 您看不到返回类型,无法保证它是 System.Collections.Generic.List 据我们所知,它可以是自定义类在清除时持续更改。我们也不知道存储库类型是否是围绕 DbContext 的自定义实现.. @Tomek 我敢打赌结果是IEnumerable&lt;T&gt; 和LINQ .ToList() 扩展返回List&lt;T&gt;,所以Clear() 什么都不做。 @vasily.sib 足够公平 @Tomek,您能否从问题中添加一个更正的代码(带有async/await),以防将来有人会以某种方式找到这个问题?

以上是关于C#中异步方法的返回类型的主要内容,如果未能解决你的问题,请参考以下文章

C#异步编程概念和使用

C# 异步编程

关于C#异步编程你应该了解的几点建议

异步编程你必须知道的6个最佳实践

如何在 Web API 的异步方法中返回 void

[翻译]用一个用户场景来掌握它们