Объясните работу GC в конкретном случае
Есть вот такой код:
public async Task<IEnumerable<Subject>> TryReadAllAsync()
{
try
{
using DataContext db = new DataContext(_connectionString);
return await Task.Run(() => db.GetTable<Subject>().ToList()).ConfigureAwait(false);
}
catch
{
return null;
}
}
И есть класс, который в конструкторе инициализирует коллекцию вот так:
public SomeClass
{
SomeClass()
{
Subjects = Task.Run(async () => await DaoFactory.GetDaoSubject().TryReadAllAsync().ConfigureAwait(false)).Result;
}
public IEnumerable<Subject> Subjects { get; set; }
}
Далее к Subjects идет обращение много где(и нигде не вызывается Dispose() явным образом).
В чем, собственно, вопрос:
если здесь return await Task.Run(() => db.GetTable<Subject>().ToList()).ConfigureAwait(false); убрать .ToList(), то после некоторого кол-ва обращений к Subjects для него где-то вызовется Dispose() неявным образом, и я на это не смог повлиять, пока не нашел решение через добавление .ToList().
Объясните, пожалуйста, почему так?
Ответы (1 шт):
using DataContext db = ... - что делает using?
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement