В моей многопоточной службе Windows я открываю подключения к базе данных в каждом потоке, после чего удаляю эти подключения, хотя проблема в том, что некоторые из них остаются незакрытыми в базе данных, когда я выполняю запрос в таблице sys.sysprocesses.
Я провел два модульных теста и увидел какое-то странное поведение. Сначала я запустил цикл со 100 задачами, и в каждом из них я открываю новое соединение. После того, как они закончены (я вижу через WaitAll ()), я вижу, что некоторые соединения все еще зависают в базе данных. Во втором модульном тесте, когда я запускаю несколько open / dispose без параллельного выполнения, он удаляет их просто отлично, и в моем db нет зависших соединений.
Проблема в том, что в моей службе Windows эти зависшие соединения добавляются, и, в конце концов, больше нет места для новых соединений, и db становится непригодным для использования пользователем.
Вот коды, первый параллельный, второй нет:
[TestMethod]
public void TestMultiThreadedAccessToExplicitObjectContext()
{
int taskSize = 100;
List<Task> taskList = new List<Task>();
int goodSources = 0;
for (int i = 0; i < taskSize; i++)
{
Task newTask = Task.Factory.StartNew(() =>
{
System.Data.Objects.ObjectContext objectContext = new PersoniteEntities();
objectContext.Connection.Open();
objectContext.Dispose();
Thread.Sleep(1200);
});
taskList.Add(newTask);
}
Task.WaitAll(taskList.ToArray());
GC.Collect();
total += goodSources;
}
[TestMethod]
public void TestMultiThreadedAccessToExplicitObjectContextInline()
{
System.Data.Objects.ObjectContext objectContext1 = new PersoniteEntities();
objectContext1.Connection.Open();
objectContext1.Dispose();
System.Data.Objects.ObjectContext objectContext2 = new PersoniteEntities();
objectContext2.Connection.Open();
objectContext2.Dispose();
System.Data.Objects.ObjectContext objectContext3 = new PersoniteEntities();
objectContext3.Connection.Open();
objectContext3.Dispose();
System.Data.Objects.ObjectContext objectContext4 = new PersoniteEntities();
objectContext4.Connection.Open();
objectContext4.Dispose();
System.Data.Objects.ObjectContext objectContext5 = new PersoniteEntities();
objectContext5.Connection.Open();
objectContext5.Dispose();
}
Спасибо