这是我的第一个WCF库,我在Windows服务中创建了它,我可以很好地访问它并通过它进行处理,但与普通库不同,我似乎无法访问其中任何一个' Web Interface之外的方法类。 WCF库中有一些线程可以保持直到它需要关闭,我需要能够告诉该库服务正在关闭,并且它需要优雅地关闭其自身内的线程。我猜我错过了一些简单的东西,但也许我可以捕获从WCF库中调用的Close()?
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 Libray中创建并在WCF库中保持OPEN。当Windows告诉我需要停止的Windows服务时,我需要WCF库来开始关闭线程属性。 serviceHost.Close()不会杀死已创建的线程,也不会杀死它。这导致Windows服务冻结等待线程停止..我试图找出如何告诉WCF库,因为它没有像对象那样的接口。我确信这很简单,而且我过度思考它。
答案 0 :(得分:0)
有点难以理解你的问题究竟是什么,但一般来说,你会按照以下步骤进行:
更新我假设您的图书馆提供了假设的 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免费获得的特征