如何从同步代码中返回任务以进行模拟实现
Posted
技术标签:
【中文标题】如何从同步代码中返回任务以进行模拟实现【英文标题】:How to return a task from synchronous code for a mock implementation 【发布时间】:2019-09-11 11:25:26 【问题描述】:我对异步等待几乎没有经验。
我正在尝试为从数据库返回数据的服务创建一个模拟。
具体的服务类可能会比较慢,所以界面返回Task如下图:
public interface IReferenceDataService
Task<List<ReferenceDataResults>> GetReferenceData(string domain, string concept);
我的模拟类如下所示:
public class MockReferenceDataService : IReferenceDataService
public async Task<List<ReferenceDataResults>> GetReferenceData(string domain, string concept)
List<ReferenceDataResults> ret = new List<ReferenceDataResults>();
var refDataRepo = new List<ReferenceDataResults>()
new ReferenceDataResults Domain = "Interfaces.Avaloq", Concept = "Client", Key1 = "CE", Value1 = "2", Key2 = "Avaloq", Value2 = "Individual" ,
new ReferenceDataResults Domain = "Interfaces.Avaloq", Concept = "Client", Key1 = "CE", Value1 = "3", Key2 = "Avaloq", Value2 = "Joint"
;
var found = refDataRepo.FindAll(x => x.Domain == domain && x.Concept == concept);
foreach (var row in found)
ret.Add(new ReferenceDataResults() Concept = row.Concept,
Domain = row.Domain, Key1 = row.Key1, Key2 = row.Key2, Value1 = row.Value1, Value2 = row.Value2 );
return ret;
这会给出编译器警告,因为它被标记为“异步”但缺少“等待”。 我猜最接近数据库检索的是 List 上的 FindAll 方法,但似乎没有我可以“等待”的 FindAll 的异步版本。
解决此问题的最佳方法是什么?
【问题讨论】:
将return语句更改为return await Task.FromResult(ret);
。您可以在here阅读有关Task.FromResult
的详细信息
@user1672994 我建议丢失async
和await
,只使用return Task.FromResult(ret);
【参考方案1】:
由于async
不构成界面的一部分,请尝试将其删除:
public class MockReferenceDataService : IReferenceDataService
public Task<List<ReferenceDataResults>> GetReferenceData(string domain, string concept)
// Your code
return Task.FromResult(ret);
【讨论】:
以上是关于如何从同步代码中返回任务以进行模拟实现的主要内容,如果未能解决你的问题,请参考以下文章