所以我要做的是一个Orchard功能如果启用,运行一个单独的线程(服务)来查询 IRepository&lt;&gt; < / strong>某些 PartRecord 。
我尝试在 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启动时启动自定义线程的常用做法。所以请纠正我,如果不是这样的话......
存储库被注入,并且首先它很好地查询表。过了一会儿,它会抛出一个例外: “当前不支持多个同时连接或同一事务中不同连接字符串的连接。” 。
看起来非常古怪,一段时间后执行几次的查询会崩溃; 这是显示我如何使用存储库的代码:
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&lt;&gt; manager.LoadIds每10秒调用一次
注意:我正在使用MySql Server 5.5
答案 0 :(得分:2)
好的,所以对于以“如何为了...而旋转一个单独的线程”开头的任何问题的答案都是“不要”。认真。请参阅示例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?