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 содержащий объект

Другие вопросы по тегам