Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading WCF InstanceContextMode.PerCall服务和多线程_Multithreading_Wcf_Windows Services - Fatal编程技术网

Multithreading WCF InstanceContextMode.PerCall服务和多线程

Multithreading WCF InstanceContextMode.PerCall服务和多线程,multithreading,wcf,windows-services,Multithreading,Wcf,Windows Services,我正在运行一个自托管WCF服务,它将是一个Windows服务,但我正在将其作为一个控制台应用程序进行调试。服务器端代码在被调用时需要做一些工作。然后将结果同步传回客户端。然后它需要进行一些更密集的长时间运行的处理 代码的简化说明如下: [ServiceBehavior(IncludeExceptionDetailInFaults = true,InstanceContextMode = InstanceContextMode.PerCall)] public class MyWCFService

我正在运行一个自托管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());
    }


}            
我有两个问题: 1.我看到在它生成的线程继续并完成之前调用了Dispose-of-Service类。我担心的是,服务类实例可能不会被释放用于垃圾收集,因为它产生了线程。这里列出的代码是否可靠,这样就不会发生这种情况? 2.该服务在Windows服务中自托管。如果对任何派生线程停止服务,会发生什么情况?有没有一种方法可以让服务等待任何线程仍然运行完成

当然,可以在线程完成之前释放服务类。如果要等待线程中的工作完成,为什么要启动线程?除此之外,我不确定你期望/想要什么样的行为。 是的,如果进程关闭,线程将死亡。您必须为服务停止回调实现一个处理程序,该处理程序会延迟关闭过程,直到所有工作人员完成。如果使用更现代的任务而不是线程,这将更容易实现。也许,您需要保留一个正在处理的任务的全局列表,以便您的关闭代码可以等待所有这些任务。