如何转换iEnumerable< task< t>> ienumerable< lt; task< t>>>在C#中?

发布于 2025-01-19 09:06:47 字数 1205 浏览 1 评论 0 原文

我有一个私人功能,它将 iEnumerable< func< task< t>>> 作为输入。我的任务< t>> 要通过。如何将转换为任务< t>> ienumerable< func< task< task< t<

Code Sample:

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);

I'm getting the following error,

无法转换 'System.Collections.generic.Ienumerable&lt; system.threading.tasks.task&gt;' 到 'system.collections.generic.Ienumerable&lt; system.func&lt; system.threading.tasks.tasks.task&lt; system.collections.generic.eneric.ienumosite

我想念一些演员吗?

I have a private function which takes IEnumerable<Func<Task<T>>> as input. I'm having IEnumerable<Task<T>> to be passed. How to convert IEnumerable<Task<T>> to IEnumerable<Func<Task<T>>>?

Code Sample:

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);

I'm getting the following error,

cannot convert from
'System.Collections.Generic.IEnumerable<System.Threading.Tasks.Task>'
to
'System.Collections.Generic.IEnumerable<System.Func<System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable>>>'

Am I missing some cast?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

宁愿没拥抱 2025-01-26 09:06:48

因此,您需要创建一个 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,因此 ParallelizeAsync 需要一个IEnumerable>>。这与你的问题的其余部分不匹配。

您可能打算调用 ParallelizeAsync(...)

So, you'll want to create a Func which, when called, returns that already-completed Task you constructed. The easist way is simply:

() => theTask

So either:

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

Or given functasks:

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

Your other problem is that you're calling:

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

Since the signature of ParallelizeAsync is:

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

This means that T is an IEnumerable<int>, so ParallelizeAsync is expecting an IEnumerable<Func<Task<IEnumerable<int>>>>. This doesn't match the rest of your question.

You probably intended to call ParallelizeAsync<int>(...).

此生挚爱伱 2025-01-26 09:06:48
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);
var l = new List<Task<bool>>();
var f = new List<Func<Task<bool>>>();
f = l.Select<Task<bool>, Func<Task<bool>>>(x => () => x).ToList();

for you, just change this line

var help = ParallelizeAsync<IEnumerable<int>>(functasks.Select(t => () => t) , 10);
江湖正好 2025-01-26 09:06:48

您需要将一个函数传递给返回另一个函数的Select

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 作为通用参数,funcs 变为 IEnumerable>>>

您应该简单地传递 int:

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

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

var help = ParallelizeAsync(functasks, 10);

You need to pass a function to Select that returns another function:

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

And in this simple example, async / await are superfluous:

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

Note that you are also calling ParallelizeAsync incorrectly; by providing IEnumerable<int> as the generic argument, funcs becomes IEnumerable<Func<Task<IEnumerable<int>>>>.

You should simply be passing int:

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

Or let type inference do the work:

var help = ParallelizeAsync(functasks, 10);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文