2009-01-10 72 views
4

我有一種情況,我開始了一些對象,當它們準備好處理一些輸入數據時,調用一個處理程序。我需要擔心Flex/AIR代碼中的併發問題嗎?

該處理程序從暫掛請求的ArrayCollection中獲取數據集,將其分配給該對象,並從ArrayCollection中刪除該數據集。

(我不能從ArrayCollection的,因爲我需要通過它來搜索,找到一個合適的數據集流行 - 這是不是總在最前面的那一個)

難道兩個對象可以打電話給我(1)第一個被分配一個數據集,(2)第二個被分配相同的數據集,然後服務於第一個的處理程序的實例已經刪除了它,我猜(3)處理程序的第二個實例嘗試從ArrayCollection中刪除數據集時發生錯誤。

我對Flash Player運行時不夠熟悉,不知道這種故障情況是否可能,或者是否應該花費額外時間進行某種鎖定以防止出現這種情況。


編輯:到目前爲止的答案給Flex的發光評論,但我不知道他們回答這個問題。要清楚,我不想決定是否使用Flex。

如果我有一個方法:

  1. 獲取一塊從某處的數據在ArrayCollection
  2. 做一些事的數據
  3. 刪除從ArrayCollection的數據

在第一次調用#1之後但是在#3之前,是否有可能再次調用同一個方法可以執行#1?你說Flex/AS「正常工作」 - 你能否澄清一下,在這種情況下它會「正常工作」嗎?

回答

8

您不需要進行鎖定,但您可能想要跟蹤對狀態進行修改的順序。不同的異步調用可以按照與發出異步調用時不同的順序返回和修改模型狀態。

Flex和AIR應用程序具有單線程編程模型。但是,他們的體系結構依賴於異步I/O來與服務器層進行交互。

現在在Java Swing應用程序或.NET Winforms應用程序中,可以在背景線程上執行I/O交互,並將參數/結果編組到主GUI線程。 (這些圖形用戶界面庫不允許其他線程更改圖形工具包對象/窗口小部件的狀態,因此數據交互必須封送到其他後臺處理線程和從其他後臺處理線程進行編組。)

相比之下,I/O類庫Flex和AIR是在這些類異步實現I/O操作的地方編寫的。例如,要執行HTTP GET,可以調用HttpSerivce send()方法,這不是阻塞調用。相反,只要調用最終完成並返回,就可以提供ActionScript3閉包來處理結果。

與此同時,Flex/AIR應用程序可以允許GUI繼續與用戶完全交互。它甚至可以顯示進度指示和/或取消按鈕。

因此,事實證明即使Flex/AIR單線程GUI模型比多線程Java Swing或.NET Winform應用程序更簡單也更容易編程,它仍然具有與那些富客戶端應用程序的風格。用於處理結果或故障的簡單事件驅動單線程GUI,異步I/O(通過服務調用和/或消息傳遞),以及用於處理結果或故障的ActionScript3閉包,是Flex/AIR用於統治世界的祕密配方。 (當然,我應該提到對這個世界征服策略的一部分屬性,事件以及很好的聲明性或強制性數據綁定的良好支持)。

+0

感謝您的澄清。 對於我的應用來說,接收呼叫的順序並不重要,重要的是我不會將相同的數據發送給兩個呼叫者。 – 2009-01-10 02:34:29

1

將自己埋在Flex和Actionscript幾個月後,已經移回到.NET;我有點被所有各種模式重新淹沒 - 或者,我必須選擇並協調。相比之下,Flex/AIR幾乎擁有一組簡單但完整的SDK調用,用於數據和文件操作,每個調用都有同步和異步變體。理解和使用一致性要容易得多。

羅傑的權利從我的經驗。 Flex/AS#正常工作。 .NET,越來越小(從選項超載,恕我直言)。其中一個後果是.NET更好地適應邊緣情況;但是如果Flex/AS3能夠滿足您的要求,它可能會輕鬆完成。認爲80/20規則(或者更好)

我認爲你的問題已經由羅傑解決,但讓我說我認爲我聽到它的方式。

您的方法在一個通用UI線程上是單線程的(與其他UI活動一起)。但是,資源(文件,數據庫管理系統端口等)通常經歷,你通常會建立這樣一個簡單的順序:

  1. 實例化所需的資源類的對象,
  2. 註冊的事件處理程序返回(例如「fileonOpen」),
  3. 調用對象的異步執行方法(比如說「file.open」)。
  4. UI事件循環繼續,
  5. 資源最終完成其方法執行,並觸發您註冊的事件處理程序,它現在在UI線程上運行,也許您的問題的答案是事件處理程序是給定的參數是它所屬的對象,所以你可以從集合中刪除它。據推測,你的對象已經足夠自我識別,以防止在處理它所屬的收藏時出現混淆。如果它是一個數據庫結果行,它可能會知道它自己的PK值。文件對象具有像nativePath,isDirectory,父(另一個File對象)等屬性。
2

正如你所描述的那樣,你的問題的答案是否定的。在瞭解事件註冊,事件分派,優先級,異步等方面都是有價值的,事實上你仍然在做主要線程中單個函數範圍內修改ArrayCollection的工作,隨後第二次調用該函數,也是在主線程上 - 所以在併發方面你沒有什麼可擔心的:雖然它是真的,但你可能不知道哪個對象首先出現(因爲很多原因),你可以確定第二個將獲得第一個工作的成果。

所以不行,你很好走。搖滾!

相關問題