【问题标题】:Any problems with wrapping Task returning method包装任务返回方法的任何问题
【发布时间】:2015-02-05 15:23:50
【问题描述】:

包装一个返回a的方法可能会遇到什么问题

Task<T> where T : ClassA

使用返回的方法

Task<T> where T : IClassA

换句话说,将一个返回某种类型的任务的方法与另一个返回该类型接口的任务的方法包装起来,如下所示:

public new Task<ITspIdentity> FindByIdAsync(string id)
{
    return new Task<ITspIdentity>(() => base.FindByIdAsync(id).Result);
}

base.FindByIdAsync(id) 将返回的位置

Task<TspIdentity>.

我正在尝试使用接口将 ASP.NET MVC 应用程序表示层与对 ASP.Identity 的依赖解耦。

【问题讨论】:

  • 您当前的实现正在返回一个永无止境的任务,因为您尚未启动它。
  • Blimey - 这至少是一个问题;)
  • 与其返回Task为什么不能返回Task?我想这会解决你的问题
  • @Srinivasan__ Op 可能需要任务的结果。
  • @Srinivasan__ 是的,但是我只是返回一个带有对象结果的任务,然后我需要对其进行投射等。对于测试和一般用途来说不太好。

标签: c# .net task-parallel-library async-await


【解决方案1】:

只要调用代码不依赖于只能通过ClassA 使用且不能通过IClassA 使用的成员,就应该没有问题。

您正在创建并返回一个Cold Task,它将同步运行一个异步方法,这是一种资源浪费。您可以重构该代码并简单地执行以下操作:

public new async Task<ITspIdentity> FindByIdAsync(string id)
{
   var tspIdentity = await base.FindByIdAsync(id).ConfigureAwait(false);
   return (ITspIdentity) tspIdentity;
}

【讨论】:

  • 不,很遗憾我不能这样做,因为 Task != Task。它们实际上是不同的类型。
  • 好的,现在我们开始讨论。特维姆。不,我不担心由于返回接口而失去对类型的访问,但我担心我进行转换的方式。 ConfigureAwait = 很棒。
猜你喜欢
  • 2020-11-22
  • 2019-07-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多