2010-12-07 83 views
1

我一直在努力解決這個問題。在C#中管理定時線程.net

在我的網站上,用戶被要求參加測試。當他提交一個答案時,我會調用一個WCF服務,將他的數據推送到數據庫中。這很簡單,但隨着用戶數量的增加,確實會變得數據庫密集。

因此,爲了提高性能(以避免重調用到DB),我有 -

一個。在服務中實施緩存。

b。實現線程(用於異步工作) - 將緩存數據推送到數據庫。

所以,現在,每當有一個呼叫保存答案來了,它在服務緩存存儲數據。同時,我運行一個線程(因爲我只想將數據推送到數據庫一次 - 在用戶測試結束時 - 並將臨時答案數據添加到緩存中),然後返回該呼叫,因爲我不想要用戶不斷等待。我運行的線程必須有15分鐘的超時時間。如果用戶在15分鐘內未提交任何答案,則應將緩存的結果保存到數據庫。直到現在,它很簡單,並設法做到這一點。

我在哪裏卡住的是,如果用戶發送的一些答案,就會調用這些15分鐘內的服務進行,該線程超時應復位到下一個15分鐘。所以,它的一個線程滑動計時器。

我用Google搜索了很多,但似乎沒有辦法跟蹤線程。而且,如果我在每個保存數據請求上創建一個新線程,那麼它只會在數據庫上重現相同的負載。

我覺得,如果可能會有一些方法來跟蹤我第一次開始線程,並相應地操縱它,我就能達到預期的事情。

請指教並提出建議。

緊迫感和感謝

SV

+1

你如何計劃線程超時?你會阻止線程15分鐘嗎?你確定數據庫寫入是你的瓶頸,你有沒有測量? – 2010-12-07 07:16:50

回答

0

你應該回答阿爾濱的查詢。反正你可以試試這個:

當用戶提交查詢(WCF服務調用),保存DB來電或一些全局對象的時間。

在線程超時邏輯計算從現在到過去的請求的時間的差。 如果差值大於等於15則釋放線程,保存數據並創建一個新線程。否則不釋放。

0

我不確定我是否明白爲什麼每次將數據添加到緩存時都要打開一個線程。難道你不能只是將數據添加到緩存中:

  1. 如果答案來了,找到緩存中的數據並保存到數據庫。

  2. 每隔一段時間運行一次「清理」線程以查找超過15分鐘的緩存中的數據並保存到數據庫並清理緩存。

  3. 如果尚未將數據添加到數據庫,那麼每增加一個數據添加到緩存中,都會有15分鐘的計時器喚醒並清除緩存。

這絕不是一個好主意,因爲無緣無故地阻塞線程,如果你正在實現一個服務器,你應該使用ThreadPool,並且阻止一個ThreadPool線程絕對不是一個好主意。

無論如何,你應該確保數據庫是你的瓶頸,因爲你可能會遇到很多麻煩與你目前的設計。例如,如果服務器崩潰並且尚未將數據保存在數據庫中呢?