可能 - 我注意到我的一些代码在10.6上出现问题,听起来像您的问题。
我需要得到一些网络信息(主要是关于BGP和AS的东西)在一个完全异步的方式。对我来说,理想的解决方案是将特殊的DNS TXT记录请求发送到可公开访问的DNS服务器,但Cocoa/Core Foundation不提供用于执行这些奇怪球DNS请求的API。另一种方法是使用shell% whois -h IP 'SPECIAL REQUEST'
并解析输出中的相关信息。这是我可以在几个小时内启动并运行的事情,稍后再回来并投入实际解决方案。非常黑客,但速度比1)找到一个合适的异步DNS库和2)加快API速度并可能为它编写一个封装。
所以,我创建了一个类,它分出后台线程,然后NSTask
启动whois
请求。后台线程位于NSRunLoop
循环中以处理结果,但会检查每秒的1/10,以查看NSTask
是否因某种原因而死亡,或者是否等[NSThread isCanceled]
等。它还会注册NSApplicationWillTerminateNotification
通知以便它可以执行如果应用程序正在退出,则进行适当的清理。
嗯,10.6 ......我再也不干“快速”。在10.5上,一切都是光滑的,应用程序立即退出,至少在感知上退出。在10.6以下,退出导致应用程序“挂起”。调试表明,一切都被挂起,试图清理挥之不去的whois NSTask
s。由于我没有获得这种方式的信息对于应用程序功能至关重要(这是额外的,很高兴知道各种信息),所以我只是对其进行了处理并停止尝试将信息作为停止解决方案。
的快速传递在调试问题表明,主要的应用程序被阻塞在试图获取实例NSLock
。有趣的是,如果我把它放在一边,应用程序最终会正常退出 - 从10-20秒到分钟的任何地方.. 10.5和10.6之间的某些变化导致代码包含在[NSLock lock] ... [NSLock unlock]
块中“需要很长时间” 。我还没有找到发生的地方,虽然(尚未优先)....但其中一件事是终止背景NSTask
,如果它仍然在运行,并“等待它完成”,然后它可以安全地摆脱像它的NSPipe
这样的东西。
DUP:这可能是一个愚蠢的答案......我的第一个似乎已经消失在任何一方?
如果用一个简单的脚本替换一个退出0,会发生什么?你现在用的那个? – 2009-10-12 02:56:49
我看到类似的问题,上面的代码有时会立即完成,有时需要几秒或更长时间才能完成。真奇怪! – Locksleyu 2016-01-22 15:10:55