WCF库与Windows服务中的线程

时间:2018-06-11 19:16:58

标签: c# wcf

这是我的第一个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库,因为它没有像对象那样的接口。我确信这很简单,而且我过度思考它。

1 个答案:

答案 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等)OnStartOnShutdown方法。 重要的是,您在后台线程中执行实际工作,即尽快退出OnStartOnShutdown方法 - 这是在这种情况下使用ServiceHost免费获得的特征