C# Windows服务中具有线程的WCF库
这是我的第一个WCF库,我在Windows服务中创建了它,我可以很好地访问它并通过它进行处理,但与普通库不同的是,我似乎无法访问Web界面之外的任何它的方法类。WCF库中有一些线程会一直保持到它需要关闭为止,我需要能够告诉这个库服务正在关闭,它需要优雅地关闭自身中的线程。我想我遗漏了一些简单的东西,但也许我可以捕获从WCF库中调用的Close()C# Windows服务中具有线程的WCF库,c#,wcf,C#,Wcf,这是我的第一个WCF库,我在Windows服务中创建了它,我可以很好地访问它并通过它进行处理,但与普通库不同的是,我似乎无法访问Web界面之外的任何它的方法类。WCF库中有一些线程会一直保持到它需要关闭为止,我需要能够告诉这个库服务正在关闭,它需要优雅地关闭自身中的线程。我想我遗漏了一些简单的东西,但也许我可以捕获从WCF库中调用的Close() ServiceHost oServiceHost = new ServiceHost(typeof(WCFListener.MyClass)); oS
ServiceHost oServiceHost = new ServiceHost(typeof(WCFListener.MyClass));
oServiceHost.Open();
//wait until shutdown is called.
while (!_shutDownEvent.WaitOne(Timeout.Infinite));
//HERE I NEED TO TELL THE LIBRARY TO STOP ANY THREADS OR
//WITHIN THE WCF CAPTURE CLOSE() WAS CALLED.
if (oServiceHost != null)
{
//close out the WCF Listener service.
oServiceHost.Close();
oServiceHost = null;
}
我知道如何在WCF库工作和处理时启动它,但是有些线程是在WCF库中创建的,并且在WCF库中保持打开状态。当Windows告诉我的Windows服务需要停止时,我需要WCF库开始关闭threads属性。serviceHost.Close()不会终止已创建的线程,我也不希望它终止。这将导致Windows服务冻结,等待线程停止。。我正试图弄清楚如何告诉WCF库这一点,因为它没有像对象那样的接口。我相信这很简单,我想得太多了 要理解您的实际问题有点困难,但一般来说,您会按照以下步骤进行: Update我假设了库提供的
MyLibraryClass.Initialize()
和MyLibraryClass.Shutdown()方法,如下所示
因此,您的库将提供如下内容:
public static class MyLibraryClass
{
public static void Initialize(ServiceHost serviceHost)
{
serviceHost.Closed += (...) {
// Cleanup when host closes.
Shutdown();
}
}
public static void Shutdown()
{
// Cleanup. E.g. stop threads, etc.
}
}
如果这不正确,您需要在问题中提供更多关于您可以做什么或不能做什么的来源/上下文。一般来说,最好不要在库中包含显式的活动组件(如线程等);如果需要这样做,您应该为库的用户提供“初始化”和/或“关闭”方法
public class MyService : ServiceBase
{
private ServiceHost serviceHost;
protected override void OnStart(string[] args)
{
serviceHost = /* new, etc. */
// Somehow pass the serviceHost reference to your library,
// then subscribe to `Closed`, e.g.
MyLibraryClass.Initialize(serviceHost);
serviceHost.Open();
}
protected override void OnShutdown()
{
serviceHost.Close();
// Do additional cleanup, e.g. stopping your "library threads"
// Alternative to the event-approach in "OnStart", simply call
MyLibraryClass.Shutdown();
}
}
也就是说,在服务启动时打开主机,在服务结束时关闭主机。服务关闭时,不应有任何额外的“等待”等理由
Windows服务控制管理器在启动/停止服务时将调用(通过p/Invoke等)OnStart
和OnShutdown
方法。
重要的是,您在后台线程中完成实际工作,即尽快退出OnStart
和OnShutdown
方法,这是ServiceHost在本例中免费提供的特性。我要补充的是,从一开始就添加一些诊断非常有用。例如,记录所有重要事件-logger.Info(“服务已启动”)代码>位于ServiceHostBase.Opened
事件处理程序,与ServiceHostBase.Closed
和ServiceHostBase.Faulted
相同。如果没有这些东西,很难解决任何与服务相关的问题。我知道如何在WCF库工作和处理时启动它,但有些线程是在启动后创建的,并在WCF库中保持打开状态。当Windows告诉我的服务需要停止时,我需要WCF库开始关闭threads属性。serviceHost.Close()不会终止已创建的线程,并导致Windows服务冻结,等待线程停止。注意注释//执行额外的清理,例如停止上面示例中的“库线程”
。这不是你想要的吗?我所说的线程在WCF库中,而不是在Windows服务中。Windows服务线程易于控制。如何让Windows服务中的WCF库停止WCF库中的线程,因为它们不是通过调用.serviceHost.Close()停止的。如果我可以在WCF库中捕获被调用的Close(),我可以处理线程,但不确定如何捕获Close被调用。您可以订阅ServiceHost
的Closed
或Closing
。但是,我仍然认为,如果这样做,您也可以在调用ServiceHost.Close()
之前或之后,简单地调用将从这些事件处理程序中调用的代码。当然。