我在使用一次性對象時試圖並行處理多個任務(或者運行時感覺適合)時遇到了問題。在以下代碼片段中,每個Processor對象在完成所需工作之前立即進行處理。當使用一次性對象時使用等待異步
async public Task ProcessData(IEnumerable<int> data)
{
var tasks = new List<Task>();
foreach (var d in data)
{
using (var processor = new Processor(d))
{
processor.Completed += (sender, e) => { // Do something else };
tasks.Add(processor.ProcessAsync());
}
}
await Task.WhenAll(tasks);
}
重新編寫的代碼,如下的結果在每個處理器中執行其處理,然後被設置,但它不是以運行不依賴於彼此的多個任務的最有效方式。
async public Task ProcessData(IEnumerable<int> data)
{
foreach (var d in data)
{
using (var processor = new Processor(d))
{
processor.Completed += (sender, e) => { // Do something else };
await processor.ProcessAsync();
}
}
}
有人可以解釋爲什麼第一個例子是「提前」處置,並舉例說明這種情況的最佳代碼模式。
爲什麼你需要將處理器對象放置在該範圍內?無論如何,處理器對象會在循環中的每個回合都離開使用範圍時被釋放。 – Christian
我想我希望編譯器能夠在封面下運行一些魔法,並自動將處置設置爲一系列延續。 –
編譯器*將*處理器設置爲一系列延續,但只有在'using'塊中有'await'時。第一個例子的根本問題是,編譯器絕對無法知道每個「處理器」的處理需要與任何特定任務的生命週期相關聯。 –