1

私は現在、サーバー上で非同期に実行される新しいタスクを生成することになっているWCFサービスを使用しています(実行する必要があるdbクエリなどがあります)。新しいタスクが終了してクライアントを閉じる前に、応答がクライアントに返される可能性があります (非常に可能性が高い)。この時点で、タスクの作成中に利用可能だった依存関係は利用できなくなります。タスクを完了するには、まだいくつかの依存関係が必要です。

新しいタスクに必要な依存関係がまだ生きていることを確認するにはどうすればよいですか?

基本的な例を示すために、いくつかの非常に単純なコードを含めました。

public string SubmitData(
            User user, Request request)
        {
            History history = m_history.CreateRequest(user);

            //New task which will do an import of data into the DB.
           Task.Factory.StartNew( () => 
               Import( user, request, history ) ); 

           /*Return some sort of response back to user so they're not waiting for 
           *the long process to complete           
           */
           return "Response";
        }

        private void Import(
            User user,
            Request request,
            History history)
        {
            var response = Import(
                user, request, history);
            m_history.Save(history, response );
        }
4

1 に答える 1

3

依存関係を自分で破棄する責任を負う必要があります。autofacを使用しているため、最も単純なソリューションが使用される可能性がありますOwned<T>

ドキュメントを参照してください:所有インスタンス

Owned<T>多くの可能性がありますが、これは大まかにあなたのコードを利用するために因数分解します:

    private Func<Owned<Importer>> importerFactory = //Constructor Injected.

    public string SubmitData(
        User user, Request request)
    {
        History history = m_history.CreateRequest(user);

        //New task which will do an import of data into the DB.
        Task.Factory.StartNew(() =>
            {
                using (var importer = importerFactory())
                {
                    importer.Value.Import(user, request, history);
                }
            });

        /*Return some sort of response back to user so they're not waiting for 
       *the long process to complete           
       */
        return "Response";
    }

    public class Importer
    {
        //m_history ...

        public void Import(
            User user,
            Request request,
            History history)
        {
            var response = Import(user, request, history);
            m_history.Save(history, response);
        }
    }

あなたの質問から判断して。Autofac、ライフタイム、および決定論的廃棄に関する追加の資料を読むことでメリットが得られる場合があります。

インスタンススコープ

生涯入門書

決定論的処分

autofacがどのように機能するかをよりしっかりと理解すると、問題が実際にはより一般的であることがわかります。つまり、タスクで使用される共有オブジェクトを適切に破棄する方法です。上記のコードでは、オブジェクトを共有せず、タスクハンドルを破棄することで問題を解決しました。

于 2012-12-03T17:12:39.017 に答える