1

我目前正在使用 WCF 服务,该服务应该生成一个新任务以在服务器上异步运行(需要进行数据库查询等)。有可能(并且很可能)在新任务完成保证客户端关闭之前将响应发送回客户端。此时,在创建任务期间可用的依赖项将不再可用。为了完成任务,我仍然需要一些依赖项。

我将如何确保新任务所需的依赖项仍然存在?

我包含了一些非常愚蠢的代码来给出一个基本的例子。

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 回答