我有一個私有函式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 >>>'
我錯過了一些演員嗎?
uj5u.com熱心網友回復:
因此,您需要創建一個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>>>>。這與您的其余問題不符。
您可能打算打電話給ParallelizeAsync<int>(...).
uj5u.com熱心網友回復:
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);
uj5u.com熱心網友回復:
您需要將一個函式傳遞給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<int>作為通用引數,funcs變為IEnumerable<Func<Task<IEnumerable<int>>>>.
你應該只是通過int:
var help = ParallelizeAsync<int>(functasks, 10);
或者讓型別推斷來完成作業:
var help = ParallelizeAsync(functasks, 10);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/457497.html
