1

自己ホスト型の 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 サービスで自己ホストされています。生成されたスレッドに対してサービスが停止するとどうなりますか? まだ実行中のスレッドが完了するまでサービスを待機させる方法はありますか?

4

1 に答える 1

0
  1. もちろん、サービス クラスはスレッドが完了する前に破棄できます。スレッド内の作業が完了するのを待ちたい場合、スレッドを開始する必要はありません。これ以外にどのような動作を期待/したいのかわかりません。
  2. はい、プロセスがシャットダウンされると、スレッドは終了します。すべてのワーカーが完了するまでシャットダウン プロセスを遅らせるサービス停止コールバックのハンドラーを実装する必要があります。Taskの代わりによりモダンな を使用すると、これを行うのが簡単になりますThreadWaitAllおそらく、シャットダウン コードがそれらのタスクを処理できるように、処理中のタスクのグローバル リストを保持する必要があります。
于 2012-12-11T10:31:42.640 に答える