【问题标题】:Extract type ICollection<> from return type Task<ICollection<>>从返回类型 Task<ICollection<>> 中提取类型 ICollection<>
【发布时间】:2021-01-26 00:01:08
【问题描述】:

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

  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 是 Type 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,但这不是解决此问题的正确方法。有人有想法吗?

【问题讨论】:

  • 正确的方式又是:await;如果您更改为public async Task&lt;WebhookResponse&gt; GetMedikament(...)await 它可以正常工作吗? (var taskLists = await GetMedikamentTask(dbId);)。从同步方法调用异步方法没有神奇的方法。
  • 但是我的 WebhookResponse 包含在一个任务中
  • 这是async 方法的行为,不管我们是否满意。它通常会导致传播到主函数,使其成为async Task,但在大多数情况下这是可以的。但是,如果您仍然对欺骗这种行为的方法感兴趣,那么您可以查看this post
  • @FelipeLivingstone 是的!是的你将会; async 具有传染性
  • @Quacke 恐怕这是我的情况......我的主要功能应该只返回一个 WebhookResponse......而不是一个任务,我仍然不知道如何工作: /

标签: c# asp.net .net asynchronous async-await


【解决方案1】:

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

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

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

如果必须,您仍然可以尝试这样做,并且有 entire articles 说明如何操作,但仍然存在一些风险和/或妥协。

在您的情况下,thread pool hack(将工作偏移到不同的线程)似乎足够合适且安全。这不会导致死锁,但是你不能修改函数内部的UI(这里不会有问题)。

函数如下所示:

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

【讨论】:

    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    相关资源
    最近更新 更多