1

dataメソッド内のストアドプロシージャ呼び出しを非同期呼び出しに変えようとしています。これは元の方法です。

public void InsertFoo(Foo foo)
{
    this.Database.SomeStoredProcedure(foo);
}

私の最初の試みはこれでした:

public void InsertFoo(Foo foo)
{
    Task.Factory.StartNew(() =>
    {
        this.Database.SomeStoredProcedure(foo);
    });
}

ただし、this.Databaseがnullであるというランタイムエラーが発生します。(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);

}

次に、foo メソッド内の非同期呼び出しが実行される前に、FooContainer が破棄されます。

そのメソッド内から非同期呼び出しを行うよりも、InsertFoo を非同期で呼び出したほうがよいと思います。

Task.Factory.StartNew(()=> xx.InsertFoo(foo))たとえば、含まれているオブジェクトを整理するために、完了時に継続を使用して何かを実行しxxます。

于 2012-07-11T21:39:57.073 に答える