Task.Factory.StartNew() в методе данных - передать эту базу данных?
Я пытаюсь превратить вызов хранимой процедуры в методе данных в асинхронный вызов. Это оригинальный метод:
public void InsertFoo(Foo foo)
{
this.Database.SomeStoredProcedure(foo);
}
Моя первая попытка была такая:
public void InsertFoo(Foo foo)
{
Task.Factory.StartNew(() =>
{
this.Database.SomeStoredProcedure(foo);
});
}
Тем не менее, я получаю ошибку во время выполнения, что this.Database является нулевым. (this.Database - это контекст данных L2S.)
Затем я провел небольшое исследование и подумал, что создание собственной локальной копии сделает это:
public void InsertFoo(Foo foo)
{
MyDataContext db = this.Database;
Task.Factory.StartNew(() =>
{
db.SomeStoredProcedure(foo);
});
}
Однако db удаляется до того, как он фактически будет использован потоком, что приведет к другой ошибке во время выполнения.
Я просто хочу передать this.Database в многопоточный метод. Это возможно? Если так, то как? this.Database будет уничтожен, когда метод вернется, потому что экземпляр класса пропал, поэтому я не уверен, как это решить.
1 ответ
Боб. Поскольку метод InsertFoo немедленно возвращает результат, содержащий экземпляр объекта доступен для сбора, и, следовательно, при обращении к базе данных экземпляр базы данных удаляется.
например, если вы делаете что-то вроде
using(var xx = new FooContainer()){
xx.Foo(foo);
}
Затем ваш FooContainer будет удален до выполнения асинхронного вызова в методе foo.
Я думаю, что вам лучше вызывать InsertFoo асинхронно, чем делать асинхронный вызов из этого метода.
Например, что-то на линии Task.Factory.StartNew(()=> xx.InsertFoo(foo))
и используя продолжение по завершении, чтобы привести в порядок ваш xx
содержащий объект