如何在 C# 中将 IEnumerable<Task<T>> 转换为 IEnumerable<Func<Task<T>>>?
How to convert IEnumerable<Task<T>> to IEnumerable<Func<Task<T>>> in C#?
我有一个私有函数,它将 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);
我收到以下错误,
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>>>'
我是不是漏掉了演员表?
因此,您需要创建一个 Func
,在调用时,returns 是您构建的 already-completed 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>>>>
。这与您的其余问题不符。
您可能打算致电 ParallelizeAsync<int>(...)
。
您需要将一个函数传递给 Select
,returns 另一个函数:
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);
我有一个私有函数,它将 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);
我收到以下错误,
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>>>'
我是不是漏掉了演员表?
因此,您需要创建一个 Func
,在调用时,returns 是您构建的 already-completed 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>>>>
。这与您的其余问题不符。
您可能打算致电 ParallelizeAsync<int>(...)
。
您需要将一个函数传递给 Select
,returns 另一个函数:
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);