繁体   English   中英

从返回类型 Task 中提取类型 ICollection&lt;&gt; <icollection<> &gt; </icollection<>

[英]Extract type ICollection<> from return type Task<ICollection<>>

我使用以下方法从数据库中获取一些数据:

  public async Task<ICollection<Medikation>> GetMedikamentTask(string dbId)
  {
     var medikamentSet = await _medikationApiService.GetMedikationSet(selector, dbId);

     var responsefiltered = medikamentSet.Results.Where(c => c.Result != null).ToList();
     return responsefiltered[0].Result.Medikation;
  }

responsefiltered 是类型 List<>,但由于我必须使用 async/await,所以我的返回类型应该包含在 Task<> 中。 问题是,在下面的 GetMedikament 方法中,我使用了 taskLists.Any 或 OrderByDescending 之类的方法,所以我必须成为 ICollection 作为答案。

public WebhookResponse GetMedikament(WebhookRequest request, string dbId, int? mediId = null)
      {
         var taskLists = GetMedikamentTask(dbId);
cut code....
          }

我尝试不使用异步方法,并调用了.Result,但这不是解决此问题的正确方法。 有人有想法吗?

通常,如果您在另一个方法中使用async方法,则第二种方法也将变为async ,因此请考虑将您的GetMedikament方法更改为:

public async Task<WebhookResponse> GetMedikament(WebhookRequest request, string dbId, int? mediId = null)
{
     var taskLists = await GetMedikamentTask(dbId);
     // do stuff
}

如果您不想这样做或不能这样做,那么有一个免责声明:尝试欺骗await/async是有风险的,因为您的应用程序可能会遇到死锁(线程可能会卡住并且应用程序可能会冻结)。

如果您必须这样做,您仍然可以尝试这样做,并且有完整的文章介绍如何这样做,但仍然存在一些风险和/或妥协。

在您的情况下, 线程池破解(将工作偏移到不同的线程)似乎足够合适且足够安全。 这不会导致死锁,但是您不能修改 function 内部的 UI(这不会是问题)。

function 看起来像这样:

public WebhookResponse GetMedikament(WebhookRequest request, string dbId, int? mediId = null)
{
     var taskLists = Task.Run(() => GetMedikamentTask(dbId)).GetAwaiter().GetResult();
     // do stuff
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM