自己ホスト型の WCF サービスを実行しています (Windows サービスになりますが、デバッグ用のコンソール アプリとして実行しています)。サーバー側のコードは、呼び出されたときに何らかの作業を行う必要があります。次に、結果を同期的にクライアントに返します。次に、より集中的な長時間実行処理を実行して実行する必要があります (つまり、非同期で)。
コードの簡略図は次のとおりです。
[ServiceBehavior(IncludeExceptionDetailInFaults = true,InstanceContextMode = InstanceContextMode.PerCall)]
public class MyWCFService : IMyWCFService, IDisposable {
private Thread importThread;
private DoWork importWork;
public MyImportResultContract StartImport(MyImportRequestContract requestParams) {
processorResult = new MyImportResultContract();
//Simulate a short piece of work here to return results to the
//caller before calling a Thread to do more processing
processorResult.Success = true;
processorResult.Messages = "A message to pass back to caller"
Console.WriteLine("WCF Class ManagedThreadId = " + Thread.CurrentThread.ManagedThreadId);
//Thread off to do long running process
importWork = new DoWork();
importThread = new Thread(importWork.Start);
importThread.Start();
//Pass back the results
return processorResult;
}
public void Dispose() {
Console.WriteLine("WCF Class Dispose : " + DateTime.Now.ToLongTimeString());
}
}
internal class DoWork : IDisposable {
public void Start() {
Console.WriteLine("Thread ManagedThreadId = " + Thread.CurrentThread.ManagedThreadId);
//Simulate a long running process
Thread.Sleep(60000);
Console.WriteLine("Thread Finished");
}
public void Dispose() {
Console.WriteLine("DoWork Class Dispose : " + DateTime.Now.ToLongTimeString());
}
}
質問が 2 つあります
。 1. サービス クラスの Dispose が、生成されたスレッドが実行されて完了する前に呼び出されています。私の懸念は、それが生成するスレッドのために、Service クラスのインスタンスがガベージ コレクション用に解放されない可能性があることです。これが起こらないように、ここで概説されているコードはしっかりしていますか?
2. サービスは、Windows サービスで自己ホストされています。生成されたスレッドに対してサービスが停止するとどうなりますか? まだ実行中のスレッドが完了するまでサービスを待機させる方法はありますか?