繁体   English   中英

如何转换 IEnumerable <task<t> > 到 IEnumerable <func<task<t> >> 在 C# 中? </func<task<t></task<t>

[英]How to convert IEnumerable<Task<T>> to IEnumerable<Func<Task<T>>> in C#?

我有一个私有的 function,它将IEnumerable<Func<Task<T>>>作为输入。 我要通过IEnumerable<Task<T>> 如何将IEnumerable<Task<T>>转换为IEnumerable<Func<Task<T>>>

代码示例:

private static async Task<IEnumerable<T>> ParallelizeAsync<T>(IEnumerable<Func<Task<T>>> funcs, int maxParallelism)
{
    var sem = new SemaphoreSlim(maxParallelism, maxParallelism);
    var result = funcs.Select(async f =>
    {
        await sem.WaitAsync();
        var r = await f();
        sem.Release();
        return r;
    });
    return await Task.WhenAll(result);
}

var functasks = Enumerable.Range(1, 5).Select(async x => await Task.FromResult(x));
var help = ParallelizeAsync<IEnumerable<int>>(functasks, 10);

我收到以下错误,

无法从“System.Collections.Generic.IEnumerable<System.Threading.Tasks.Task>”转换为“System.Collections.Generic.IEnumerable<System.Func<System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable >>>'

我错过了一些演员吗?

因此,您需要创建一个Func ,当调用它时,它会返回您构建的已经完成的Task 最简单的方法很简单:

() => theTask

所以要么:

var functasks = Enumerable.Range(1, 5).Select(x => () => Task.FromResult(x));

或者给出functasks

var help = ParallelizeAsync<int>(functasks.Select(x => () => x), 10);

你的另一个问题是你在打电话:

var help = ParallelizeAsync<IEnumerable<int>>(functasks, 10)

由于ParallelizeAsync的签名是:

private static async Task<IEnumerable<T>> ParallelizeAsync<T>(IEnumerable<Func<Task<T>>> funcs, int maxParallelism)

这意味着T是一个IEnumerable<int> ,因此ParallelizeAsync需要一个IEnumerable<Func<Task<IEnumerable<int>>>> 这与您问题的 rest 不匹配。

您可能打算调用ParallelizeAsync<int>(...)

您需要将 function 传递给Select ,然后返回另一个 function:

var functasks = Enumerable.Range(1, 5)
    .Select(x => async () => await Task.FromResult(x));

在这个简单的例子中, async / await是多余的:

var functasks = Enumerable.Range(1, 5).Select(x => () => Task.FromResult(x));

请注意,您还错误地调用了ParallelizeAsync 通过提供IEnumerable<int>作为通用参数, funcs变为IEnumerable<Func<Task<IEnumerable<int>>>>

你应该简单地传递int

var help = ParallelizeAsync<int>(functasks, 10);

或者让类型推断来完成工作:

var help = ParallelizeAsync(functasks, 10);
var l = new List<Task<bool>>();
var f = new List<Func<Task<bool>>>();
f = l.Select<Task<bool>, Func<Task<bool>>>(x => () => x).ToList();

对你来说,只需更改此行

var help = ParallelizeAsync<IEnumerable<int>>(functasks.Select(t => () => t) , 10);

暂无
暂无

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

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