Dlaczego warto spróbować / w końcu, a nie „używać” oświadczenia, aby uniknąć sytuacji wyścigu?
To pytanie dotyczy komentarza w innym wpisie tutaj:Anulowanie kwerendy Framework Entity
Będę odtworzyć przykład kodu z jasności:
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();
Nie mogę zrozumieć komentarza, który mówi
Nie używaj go, ponieważ może to spowodować stan wyścigu
entities
jest zmienną lokalną i nie zostanie udostępniona, jeśli kod zostanie ponownie wprowadzony w innym wątku iw tym samym wątku wydaje się całkowicie bezpieczne (a nawet równoważne podanemu kodowi) przypisanie go do instrukcji „używanie” w zwykły sposób, zamiast robienia rzeczy ręcznie za pomocą try / Wreszcie. Czy ktoś może mnie oświecić?