注意下面的代碼來自asp.net。閉合對象上的垃圾收集
如果我有以下
AmazonS3 s3Client = Amazon.AWSClientFactory.CreateAmazonS3Client();
// ...
// details elided
// ...
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler((s, args) =>
{
s3Client.PutObject(titledRequest);
});
new Thread(() => worker.RunWorkerAsync()).Start();
的(寫得不好的)代碼將垃圾收集足夠聰明,永遠,永遠收集s3Client
對象,直到背景工人用它做?
注意,我只是爲了修復被asp.net的時候我直接斷火的背景工人出現這種情況中引發了一個惱人的錯誤拉開後臺工作線程的內部。
沒錯。這是GC的用途。在線程失去所有引用之前,s3client將被保留! – quetzalcoatl
你爲什麼要開始一個新線程來運行'RunWorkerAsync()'。這是一個開始的異步方法;該方法的內容只是創建一個新線程,配置它一下,然後啓動它。沒有必要在後臺線程中這樣做;這樣做會增加毫無意義的開銷。你也不需要定義使用lambdas時使用的委託,你可以完全移除'new DoWorkEventHandler';它將基於上下文隱含。 – Servy
@Servy感謝關於不需要定義委託的提示。另一方面,當你啓動一個backgroundWorker時,asp.net會拋出令人難以置信的煩人錯誤。從周圍搜索似乎沒有一個簡單的修復,所以我用這個俗氣的解決方法。 –