2015-09-14 110 views
0

我有一個不斷需要檢查是否有工作要做的函數,它以下列方式去了解:這是爲什麼導致堆棧溢出?遞歸函數和SQLite

僞代碼:

Class SeperateThread{ 
    function Start(){ 
     DoWork(); 
    } 
    function DoWork(){ 
     New DBContext; 
     DBContext.GetWorkFromTables(); 
     Perform work in Extra Seperate Threads if there is work to do... 
     NotifyWhenTasksAreFinished(); 
    } 
    NotifyWhenTasksAreFinished(){ 
     (Loop)Check if tasks are finished in seperate thread 
     If Tasks are finished 
     Break loop, wait a few seconds and.... 
     DoWork(); 
    } 
} 

我使用SQLite和獲得一個堆棧溢出SQLITE.interop.dll

SQLITE工作完成的唯一地方是DBContext.GetWorkFromTables()

這一切工作正常幾個小時...幾個小時後... APPCRASH與sqlite.interop.dll內的堆棧溢出。

任何人都可以解釋這是什麼原因,也許是一種解決方法? 我懷疑遞歸函數與它有關...

難道是DBContext不會自動處置,也許這​​是原因?

我使用telerik數據訪問作爲ORM,但它有點像實體框架一樣工作。

+4

'DoWork'調用'NotifyWhenTasksAreFinished'調用'DoWork' ...這很可能與SQLite無關。 SQLite似乎是罪魁禍首的可能原因是堆棧溢出異常就像用水填滿你的玻璃杯。它不一定是你放入杯子的最後一滴,你認爲溢出的原因,這是你之前投入的100億滴。 –

+0

你相信遞歸可能是原因嗎?這是不是一般錯誤地執行無效或是因爲一些物體可能不會被丟棄?如果它是錯誤的,會提出什麼解決方法?感謝您的迴應。 – user1841243

回答

2

由於@Lasse explains in their comment,無限遞歸將填滿您的堆棧並導致您得到的異常。

修復非常簡單:刪除遞歸。

void Start() 
{ 
    while (true) 
    { 
     DoWork(); 
     NotifyWhenTasksAreFinished(); 
    } 
} 
+0

Awsome!我會試試這個,並且會回來接受。大拇指已經爲直接的答案! – user1841243