2 回答
TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超4個(gè)贊
我會(huì)在你更新你的問題時(shí)更新這個(gè),但這是我最好的猜測(cè)。
這一行不會(huì)編譯,因?yàn)?Select 不返回列表:
List<Task<T>> myTasks = someList.Select(x => Task.Run(() => DoSomethingWith(x)));
我要冒險(xiǎn)猜測(cè)你實(shí)際上正在這樣做:
var myTasks = someList.Select(x => Task.Run(() => DoSomethingWith(x)));
...這會(huì)產(chǎn)生一個(gè)冷IEnumerable:一個(gè)只會(huì)在它實(shí)際被迭代時(shí)運(yùn)行。
在上面的代碼中,當(dāng)您調(diào)用它時(shí),您正在對(duì)其進(jìn)行迭代.ToArray()。但是你描述為 25ms 的那條線同樣只產(chǎn)生了另一種感冒IEnumerable<>。這里沒有做真正的工作:
var myResults = myTasks.Select(task => task.Result);
所以我再次冒險(xiǎn)猜測(cè)你正在做更多這樣的事情:
var myResults = myTasks.Select(task => task.Result).ToList();
...這將重復(fù)myTasks 第二次,導(dǎo)致Task.Run(...)為 中的每個(gè)項(xiàng)目再次調(diào)用someList,然后等待所有這些任務(wù)完成。
換句話說,你做了兩次工作,其中一次在你最后引用的行中。
幸運(yùn)的是,有一種更好的方法來完成您正在做的事情,那就是使用任務(wù)并行庫。
var myResults = someList .AsParallel() .Select(x => DoSomethingWith(x)) .ToList();
TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個(gè)贊
如果您確定第 3 行是導(dǎo)致減速的那一行,那么就沒什么可做的了。這是所有運(yùn)行時(shí)庫代碼,MS 在優(yōu)化方面運(yùn)行得非常嚴(yán)格。
您可能希望手動(dòng)迭代 myTasks 以避免 Select 代碼,但如果您獲得了幾毫秒,我會(huì)感到驚訝。
- 2 回答
- 0 關(guān)注
- 296 瀏覽
添加回答
舉報(bào)
