0

所以我想要做的是一个果园功能,如果启用,它会运行一个单独的线程(服务)来查询一些PartRecord的IRepository<>

关于启动服务:

我尝试在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 启动时启动自定义线程的常见做法。所以,如果不是这样,请纠正我..

关于Repository查询问题:

存储库被注入,起初它查询表就好了。过了一会儿,它抛出一个异常说:“当前不支持多个同时连接或在同一事务中具有不同连接字符串的连接。” .

似乎非常奇怪的是,执行了几次的查询会在一段时间后崩溃;这是展示我如何使用存储库的代码:

 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

4

1 回答 1

2

好的,所以任何以“我如何旋转一个单独的线程以便...”开头的问题的答案都是“不要”。严重地。参见例如http://ayende.com/blog/158945/thou-shall-not-do-threading-unless-you-know-what-you-are-doing

幸运的是,Orchard 提供了一种无需自旋线程即可在后台运行任务的方法:如何在 Orchard 中运行计划任务?

于 2012-12-08T22:33:19.720 回答