だから私がやろうとしているのは、有効になっている場合、一部の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 の起動時にカスタム定義スレッドを開始するための一般的な方法であるかどうかはわかりません。このように行われていない場合は、私を修正してください..
リポジトリのクエリの問題について:
リポジトリが挿入され、最初はテーブルに問題なくクエリを実行します。しばらくすると、「複数の同時接続または同じトランザクション内の異なる接続文字列による接続は現在サポートされていません」という例外がスローされます。.
数回実行されたクエリがしばらくするとクラッシュするのは非常に奇妙に思えます。リポジトリの使用方法を示すコードは次のとおりです。
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 秒に 1 回呼び出されます
注: MySql Server 5.5を使用しています