Warum sollte / finally anstelle einer using-Anweisung helfen, eine Race-Bedingung zu vermeiden?
Diese Frage bezieht sich auf einen Kommentar in einem anderen Beitrag hier:Abbrechen einer Entity Framework-Abfrage
Ich werde das Codebeispiel aus Gründen der Klarheit von dort reproduzieren:
var thread = new Thread((param) =>
{
var currentString = param as string;
if (currentString == null)
{
// TODO OMG exception
throw new Exception();
}
AdventureWorks2008R2Entities entities = null;
try // Don't use using because it can cause race condition
{
entities = new AdventureWorks2008R2Entities();
ObjectQuery<Person> query = entities.People
.Include("Password")
.Include("PersonPhone")
.Include("EmailAddress")
.Include("BusinessEntity")
.Include("BusinessEntityContact");
// Improves performance of readonly query where
// objects do not have to be tracked by context
// Edit: But it doesn't work for this query because of includes
// query.MergeOption = MergeOption.NoTracking;
foreach (var record in query
.Where(p => p.LastName.StartsWith(currentString)))
{
// TODO fill some buffer and invoke UI update
}
}
finally
{
if (entities != null)
{
entities.Dispose();
}
}
});
thread.Start("P");
// Just for test
Thread.Sleep(500);
thread.Abort();
Ich kann den Kommentar, der sagt, nicht verstehen
Nicht verwenden, da dies zu Rennstörungen führen kann
entities
ist eine lokale Variable und wird nicht freigegeben, wenn der Code in einem anderen Thread erneut eingegeben wird. Innerhalb desselben Threads scheint es absolut sicher (und in der Tat äquivalent zum angegebenen Code), ihn in einer using-Anweisung in zuzuweisen auf die übliche Art und Weise, anstatt die Dinge manuell mit dem try / finally zu erledigen. Kann mich jemand aufklären?