C# Windows服务中具有线程的WCF库

C# Windows服务中具有线程的WCF库,c#,wcf,C#,Wcf,这是我的第一个WCF库,我在Windows服务中创建了它,我可以很好地访问它并通过它进行处理,但与普通库不同的是,我似乎无法访问Web界面之外的任何它的方法类。WCF库中有一些线程会一直保持到它需要关闭为止,我需要能够告诉这个库服务正在关闭,它需要优雅地关闭自身中的线程。我想我遗漏了一些简单的东西,但也许我可以捕获从WCF库中调用的Close() ServiceHost oServiceHost = new ServiceHost(typeof(WCFListener.MyClass)); oS

这是我的第一个WCF库,我在Windows服务中创建了它,我可以很好地访问它并通过它进行处理,但与普通库不同的是,我似乎无法访问Web界面之外的任何它的方法类。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库中创建的,并且在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()
之前或之后,简单地调用将从这些事件处理程序中调用的代码。当然。