代码之家  ›  专栏  ›  技术社区  ›  Chizl

在Windows服务中具有线程的WCF库

  •  0
  • Chizl  · 技术社区  · 7 年前

    这是我的第一个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库开始关闭线程属性。servicehost.close()不会终止已创建的线程,我也不希望这样做。这将导致Windows服务冻结,等待线程停止。我正试图弄明白如何告诉WCF库这一点,因为它没有类似对象的接口。我相信这很简单,我想得太多了。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Christian.K    7 年前

    假设 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 方法。 开始 方法尽可能快-在这种情况下,这是一个您可以免费使用ServiceHost的特性。