2015-12-21 72 views
-1

我有一個具有異步啓動和停止方法的第三方對象。每個啓動和停止都可能失敗,並有異常。該對象不可重入,即,在上一次啓動/停止完成後,我只能調用其啓動或停止方法。異步啓動/停止狀態轉換

我需要有一個處理這些過渡到正確的(=最後問)狀態的類,同時儘量減少轉換的數量,讓我的客戶從任何線程在任何時間提交開始的任何數量/停止請求。

目前,我已經在async方法中實現了無限循環的功能,但是它太複雜了,循環超過4頁長,每次迭代時我需要在8個狀態之間手動切換(使用以下3位:需要啓動/停止,嘗試啓動/停止,失敗/成功)。它聞起來臭臭的。

我有一種感覺,我可能會錯過這裏明顯的東西。 此外,我的代碼看起來有點類似於編譯異步函數時的編譯器。 有沒有更好的方法來解決這個問題?

+0

你能展示/分享代碼嗎?也許它更適合http://codereview.stackexchange.com/? –

+0

@RonKlein謝謝你的建議。我會問我的客戶他們是否可以,如果是的話,會嘗試codereview。 – Soonts

+0

@RonKlein客戶說他們可以分享那個特定的課程。這是代碼:http://codereview.stackexchange.com/q/114764/46194 – Soonts

回答

0

聽起來像你需要一個互斥的電話。您需要阻止任何其他代碼調用這些方法,直到方法返回(或表示它們已完成)。

我會簡單地包裝對象併爲調用添加一個互斥鎖。這樣,如果您不同時撥打兩個電話,您可以保證。

你不需要阻塞互斥體。你可以使用像生產者/消費者隊列或線程池這樣的東西來同步訪問。

如果您處於單線程環境中,也可以使用簡單隊列(並跳過所有多線程對象)。

+0

我使用監視器來保護我的狀態。 環境非常多線程,我的代碼在CLR池線程上運行,也在Media Foundation工作線程上運行。 如果我將使用一個隊列,並且客戶端將快速提交3個請求start,然後停止,然後啓動,我將有3個狀態轉換啓動停止啓動,而在這種情況下,我只需要一個,即可開始。 – Soonts

+0

正如你在問題中所說的那樣,你需要最後一個詢問狀態,修改你的請求隊列以在發出狀態改變之前將其清空(並且忽略除最後一個狀態之外的所有內容)。 – Sorin

+0

難道你不認爲只有最後一個值的隊列可以被一個單一的bool變量替換嗎?爲什麼要使用隊列? – Soonts