相关疑难解决方法(0)

如何将Task <TDerived>转换为Task <TBase>?

由于C#的Task是一个类,你显然无法将其转换Task<TDerived>为a Task<TBase>.

但是,你可以这样做:

public async Task<TBase> Run() {
    return await MethodThatReturnsDerivedTask();
}
Run Code Online (Sandbox Code Playgroud)

是否有一个静态任务方法我可以调用来获取一个Task<TDerived>基本上只指向底层任务并转换结果的实例?我喜欢这样的东西:

public Task<TBase> Run() {
    return Task.FromDerived(MethodThatReturnsDerivedTask());
}
Run Code Online (Sandbox Code Playgroud)

这种方法存在吗?是否仅为此目的使用异步方法有任何开销?

c# task async-await

25
推荐指数
2
解决办法
7163
查看次数

无法将任务&lt;List&lt;TEntity&gt;&gt; 转换为任务&lt;IList&lt;TEntity&gt;&gt;

我正在围绕 EF Core 编写一个小包装方法DbSet。我有以下方法:

public Task<IList<TEntity>> GetAsync(Func<IQueryable<TEntity>, IQueryable<TEntity>> getFunction)
{
    if (getFunction == null)
    {
        Task.FromResult(new List<TEntity>());
    }
    return getFunction(_dbSet).AsNoTracking().ToListAsync();
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,该类是通用的,并且 _dbSet 是DbSet上下文中具体的实例。然而,对于这个问题来说,这并不重要。
对于代码我得到以下错误:

[CS0029] 无法将类型“System.Threading.Tasks.Task>”隐式转换为“System.Threading.Tasks.Task>”

如果我将返回值更改为Task<List<TEntity>>则不会出现错误。
有谁知道为什么它不能转换它?谢谢!

c# asynchronous covariance contravariance async-await

3
推荐指数
1
解决办法
2012
查看次数

如何从 Task&lt;List&lt;Derived&gt;&gt; 转换为 Task&lt;List&lt;Base&gt;&gt;

正如标题所述,我很好奇是否可以从 转换Task<List<Derived>>Task<List<BaseType>>

我有几个返回 的方法Task<List<Derived>>,并且可以有多种类型的派生类。我想将所有任务存储在任务列表中:List<Task<List<BaseType>>>稍后执行。

如果我的任务不是包装列表,这将非常简单:链接


编辑1

这是我遇到问题的部分,我在将任务存储在列表中时遇到问题:

// This throws an error (cannot convert derived list to base list)
var tasks = new List<Task<List<BaseType>>>
{
    asyncThing1(), // returns Task<List<Derived1>>
    asyncThing2(), // returns Task<List<Derived2>>
    // ... n number more
};

// Need the list of tasks before I can execute
List<BaseType>[] results = await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)

编辑2

以上,List<Base>[]改为List<BaseType>[]

c# generics asynchronous async-await

-1
推荐指数
1
解决办法
930
查看次数