Multithreading WCF InstanceContextMode.PerCall服务和多线程
我正在运行一个自托管WCF服务,它将是一个Windows服务,但我正在将其作为一个控制台应用程序进行调试。服务器端代码在被调用时需要做一些工作。然后将结果同步传回客户端。然后它需要进行一些更密集的长时间运行的处理 代码的简化说明如下:Multithreading WCF InstanceContextMode.PerCall服务和多线程,multithreading,wcf,windows-services,Multithreading,Wcf,Windows Services,我正在运行一个自托管WCF服务,它将是一个Windows服务,但我正在将其作为一个控制台应用程序进行调试。服务器端代码在被调用时需要做一些工作。然后将结果同步传回客户端。然后它需要进行一些更密集的长时间运行的处理 代码的简化说明如下: [ServiceBehavior(IncludeExceptionDetailInFaults = true,InstanceContextMode = InstanceContextMode.PerCall)] public class MyWCFService
[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服务中自托管。如果对任何派生线程停止服务,会发生什么情况?有没有一种方法可以让服务等待任何线程仍然运行完成
当然,可以在线程完成之前释放服务类。如果要等待线程中的工作完成,为什么要启动线程?除此之外,我不确定你期望/想要什么样的行为。
是的,如果进程关闭,线程将死亡。您必须为服务停止回调实现一个处理程序,该处理程序会延迟关闭过程,直到所有工作人员完成。如果使用更现代的任务而不是线程,这将更容易实现。也许,您需要保留一个正在处理的任务的全局列表,以便您的关闭代码可以等待所有这些任务。