可能 - 我注意到我的一些代碼在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