所以我想做的是一个 Orchard 功能,如果启用,运行一个单独的线程(服务)来查询IRepository<>一些PartRecord的strong>。
关于启动服务:
我尝试在 IFeatureEventHandler.Enabled() 上启动该服务,但这仅在启用该功能时执行,而不是在 Orchard 启动时执行。
所以我在 Orchard 框架中查找了我可以使用的任何内容,并找到了 IOrchardShellEvents.Activated()。
所以我基本上是这样做的:
public class MyService : IOrchardShellEvents {
...More stuff...
public void Activated() {
running = true;
//Run DoWork() in separate thread
}
public void Terminating() {
running = false;
}
private void DoWork(){
//do service work while running = true
}
}
这确实有效,但我不确定这是否是 Orchard 启动时启动自定义线程的常见做法。因此,如果没有这样做,请纠正我..
关于存储库查询问题:
存储库被注入(inject),首先它查询表很好。一段时间后,它会抛出一个异常:“当前不支持多个同时连接或同一事务内具有不同连接字符串的连接。”。
这看起来非常奇怪,一个执行了几次的查询在一段时间后崩溃了; 这是显示我如何使用存储库的代码:
public MyService(ServiceManager manager, IRepository<SomePartRecord> repo) {
this.manager = manager;
//The manager of the service uses the repository to get a single column(ExpectaId, not a PK) out of each row
manager.LoadIds = () =>
repo.Table.ToList().Select(record => record.ExpectaId);
}
注意: Func<> manager.LoadIds 每 10 秒调用一次
注意:我使用的是 MySql Server 5.5
最佳答案
好的,所以任何以“我如何旋转一个单独的线程以便......”开头的问题的答案都是“不”。严重地。例如,参见http://ayende.com/blog/158945/thou-shall-not-do-threading-unless-you-know-what-you-are-doing
幸运的是,Orchard 提供了一种在后台运行任务的方法,而无需旋转您自己的线程:How to run scheduled tasks in Orchard?
关于mysql - Orchard 中的后台运行功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13778217/