使用 StructureMap 处理Timer_Elapsed中的数据上下文操作

本文关键字:数据 上下文 操作 Elapsed StructureMap 处理 Timer 使用 | 更新日期: 2023-09-27 18:37:11

请问在timer_elapsed事件中连接/使用datacontext对象的最佳方法是什么。我在timer_elapsed中有一个 datacontext 对象,它第一次运行完美,但在 timer_elapsed 事件的后续调用中什么也不做。我知道线程池线程上已过事件的每次调用都会创建一个新实例。如何控制这种行为或至少让我的代码一致地运行。谢谢。

这是我的结构图配置

ForRequestedType<BulkSMSDataContext>()
            .TheDefaultIs(() => new BulkSMSDataContext())
            .CacheBy(InstanceScope.Hybrid);

这是我的计时器实现

void _timerSendScheduledMessages_Elapsed(object sender, ElapsedEventArgs e)
    {
        DateTime currentUTC = DateTime.UtcNow.AddSeconds(-DateTime.UtcNow.Second).AddMilliseconds(-DateTime.UtcNow.Millisecond);
        var msgToSend = from c in _messageRepository.GetMessages(MessageTypes.Scheduled)
                        where c.Time == currentUTC
                        select c;

        foreach (var msg in msgToSend)
        {
            int scheduledMsgID = msg.MessageID;
            Response res = _messageService.Send(msg);
            _messageRepository.DeleteScheduledMessage(scheduledMsgID);
        }
    }

使用 StructureMap 处理Timer_Elapsed中的数据上下文操作

为了更好地控制范围,我会更改已用事件以在每次调用它时创建一个新_messageRepository,假设您将数据上下文传递给该_messageRepository。然后让 structuremap 将您的数据上下文注入其中。

否则,您

最终会得到一个定义不明确的工作单元,这往往会带来像您遇到的范围界定问题。

但是,如果没有看到您的实施,很难确切地说。