Orchard中的后台运行功能

时间:2012-12-08 14:09:15

标签: mysql nhibernate orchardcms

所以我要做的是一个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

1 个答案:

答案 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?