1

我正在尝试将数据方法中的存储过程调用转换为异步调用。这是原始方法:

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 在方法返回时将被销毁,因为类实例已经消失,所以我不知道如何解决这个问题。

4

1 回答 1

2

鲍勃。由于 InsertFoo 方法立即返回,包含的对象实例可用于收集,因此当调用数据库时,数据库实例已被释放。

例如,如果你正在做类似的事情

using(var xx = new FooContainer()){

xx.Foo(foo);

}

然后,您的 FooContainer 将在 foo 方法中的异步调用执行之前进行处理。

我认为您最好异步调用 InsertFoo 而不是从该方法中进行异步调用。

例如Task.Factory.StartNew(()=> xx.InsertFoo(foo)),使用完成时的延续来整理xx包含对象的内容。

于 2012-07-11T21:39:57.073 回答