使用 StructureMap 在 Timer_Elapsed 中处理 Datacontext 操作
Posted
技术标签:
【中文标题】使用 StructureMap 在 Timer_Elapsed 中处理 Datacontext 操作【英文标题】:Handling Datacontext Operations in Timer_Elapsed using StructureMap 【发布时间】:2012-06-18 06:26:43 【问题描述】:请问在 timer_elapsed 事件中连接/使用 datacontext 对象的最佳方法是什么。我在 timer_elapsed 中有一个 datacontext 对象,它第一次运行完美,但在随后调用 timer_elapsed 事件时什么也不做。我知道每次调用线程池线程上的 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);
【问题讨论】:
【参考方案1】:为了更好地控制范围,我会在每次调用时更改 elapsed 事件以创建一个新的 _messageRepository,假设您将 datacontext 传递给 _messageRepository。然后让结构映射将您的数据上下文注入其中。
否则,您最终会得到一个定义不明确的工作单元,这往往会引发像您遇到的那样的范围界定问题。
虽然没有看到你的实现,但很难准确地说出来。
【讨论】:
以上是关于使用 StructureMap 在 Timer_Elapsed 中处理 Datacontext 操作的主要内容,如果未能解决你的问题,请参考以下文章
使用 PetaPoco 与 StructureMap 的共享连接
使用 StructureMap 在 Timer_Elapsed 中处理 Datacontext 操作