2012-02-22 135 views
0

我有一个WCF服务,我在IIS 7.5和Windows 2008的AppFabric上托管。服务设置为按照建议自动启动。 当服务启动时,它进入一个永不停止的while循环,请记住这是所需的行为。 while循环应该处理一些我不知道它何时可用的数据。有没有办法确定IIS或网站已被停止?

问题是当我关闭网站或IIS时,服务仍在运行。所以我的问题是:
有没有办法确定IIS或网站已被停止?
有没有更好的方式来实现这种永无止境的行为?

希望这里有足够的信息。

+4

是什么while循环呢?你为什么需要有一个?这些信息将对答案有帮助。 – usr 2012-02-22 00:07:49

+0

也许Windows服务中的主机? – 2012-02-22 00:08:54

+0

随着usr的问题:你为什么要一个服务永远循环?看起来......错了。 – NotMe 2012-02-22 00:09:33

回答

0

好的,所以你有一个无限的轮询循环运行。这种设计很有意义,尽管它很不寻常。

我建议您启动一个单独的线程进行轮询。您的线程代码应该如下所示:

void ThreadProc() { 
try { 
    while(true) { ... } 
} 
catch (ThreadAbortException) { 
    //AppDomain shutdown 
} 
} 

当关闭所有线程时将被中止。这是检测关机的技巧。

启动线程这样的:

new Thread(ThreadProc) { IsBackground = true } 
+0

我会尝试这种方法,但这里有一些想法,我不认为有任何ThreadAbortException,我相信该服务完全托管在AppFabric上,而IIS只是某种类型的主机,因此查杀IIS从不触发任何错误或在应用程序上的奇怪行为,也许有一个事件,我可以连接到这将帮助我。 – Oakcool 2012-02-22 00:45:26

+0

如果您的主机进程死亡,则不会收到任何事件。这个过程*不见了*。在这种情况下,您只能收到通知。 – usr 2012-02-22 11:39:32

0

与本网站状态检测方面的问题:如果你知道网站的名称,你可以使用Microsoft.Web.Administration API来确定,如果该网站已经开始或没有。一些很好的例子可在Learn IIS website

不过,我第二关心别人在这里,为什么您使用的是无限循环......

+0

正如我已经表明我愿意提供建议,但原因是我正在进行轮询以了解何时处理数据。该服务实际上联系了我不拥有的其他服务,所以我不知道它何时被使用。 – Oakcool 2012-02-22 17:35:14

+0

我明白了。所以有人打电话给你的服务,并在响应联系,其他服务,更正?如果是这样,为什么你需要无限等待一些东西?使用WCF的整个观点似乎在请求到达时处理Web请求和处理数据......我错过了什么?无论如何,您应该能够使用上面的Microsoft.Web.Administration API检测网站是否启动。 – 2012-02-23 04:15:06

+0

该服务的行为像一个Windows服务,它应该是一样的确切的东西,而不是我使用WCF的“APPFABRIC”的Windows服务。所以不,没有人叫它,它应该是自给自足的,随时都在运行,轮询数据等待正确的信息被发现,然后发生一些处理。 – Oakcool 2012-02-23 04:44:18