【问题标题】:WCF InstanceContextMode.PerCall Services and Multi-ThreadingWCF InstanceContextMode.PerCall 服务和多线程
【发布时间】:2012-12-11 09:58:26
【问题描述】:

我正在运行一个自托管的 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 服务中。如果对任何衍生线程停止服务会发生什么?有没有办法让服务等到任何仍在运行的线程完成?

【问题讨论】:

    标签: multithreading wcf windows-services


    【解决方案1】:
    1. 当然可以在线程完成之前释放服务类。如果你想等待线程中的工作完成,为什么要启动一个线程?除了这个,我不确定你期望/想要什么行为。
    2. 是的,如果进程关闭,你的线程就会死掉。您必须为服务停止回调实现一个处理程序,该处理程序会延迟关闭过程,直到所有工作人员都完成。如果您使用更现代的Task 而不是Thread,这将更容易做到。可能,您需要保留一个正在进行的任务的全局列表,以便您的关闭代码可以WaitAll 处理这些任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多