,我發現自己最近使用SemaphoreSlim
類,限制在(大)的可並行操作的進度工作流資源:以流資源的並行操作的進度限制工作
// The below code is an example of the structure of the code, there are some
// omissions around handling of tasks that do not run to completion that should be in production code
SemaphoreSlim semaphore = new SemaphoreSlim(Environment.ProcessorCount * someMagicNumber);
foreach (var result in StreamResults())
{
semaphore.Wait();
var task = DoWorkAsync(result).ContinueWith(t => semaphore.Release());
...
}
這是爲了避免將太多的結果帶入內存,並且程序無法應付(通常通過OutOfMemoryException證明)。儘管代碼工作正常並且性能合理,但仍然感覺不太好。特別是someMagicNumber
乘數,它雖然通過分析進行調整,但可能並不盡如人意,並且也不適應DoWorkAsync
的實施變化。
以同樣的方式,線程池可以克服安排許多事情執行的障礙,我希望能夠克服根據可用資源將許多事情加載到內存中的障礙。
由於確定性地不可能確定OutOfMemoryException是否會發生,我明白我所尋找的可能只能通過統計方式實現,或者根本不可能實現,但是我希望我錯過了一些東西。
你介意DoWorkAsync()是否被實際同步執行?你可以使用C#5嗎?這與'收益率回報'有什麼關係? – svick
@svick我寧可DoWorkAsync同步執行,因爲執行網絡IO並且可以使用完成端口線程。 yield-return被標記爲簡單因爲它是如何返回'StreamResults'的結果。我不能使用.C#5(或者4.5,或者MS現在調用它的任何版本!),只需C#4.0 –
它被稱爲C#5.0,它將與.Net 4.5一起發佈。是的,.Net版本號可能會令人困惑。 – svick