2010年7月30日 星期五

Flex_多執行序發生的誤會

以往比較少寫前端介面、後端服務的專案,最近同事遇到一個看似靈異事件的錯誤,今天問老師才知道是一個多執行緒的錯誤。也才想到之前進行WCF服務想用在ASPX頁面上時發生的問題

----------------------------------------------

所以遇到的問題是:執行某一個函式A將其結果丟給一個全域的ArrayCollection,並在之後的程式使用裡面的值;一切聽起來很合理,但是當去執行時,卻一值無法抓取到存進ArrayCollection的數值,趕快以debug模式來看看為什麼沒有值?發現程式跑到函式A內時的確有正確抓到數值並已存入ArrayCollection,但要使用時卻顯示空值。

之後利用Alert分別對於函式內外去對ArrayCollection判斷是否為Null,發現跳出的第一個Alert為not Null,第二個Alert為Null,所以很明顯他抓到了,他又丟掉了?

晚上同事問老師以後,有兩個重點:
1. Flex為多執行緒的程式,所吐出的兩個Alert不見得你所看到的第一個就是你認為程式所執行的第一個Alert,有可能後面執行出來的Alert蓋住前面的,導致你以為程式邏輯是A→B,但其實是B→A;所以若是偵錯時使用Alert有可以誤判邏輯順序,最好使用中斷點或是trace()來處理。(後來使用中斷點也查出其實程式處理程序跟我們的想像相反,原因就是第2點)

2. Flex前端在送出需求後,會繼續執行後面的程式,也就是所謂的非同步;所以才導致誤判程式的執行順序,以為已經抓取到的資料又丟失了,但其實是還沒抓到就先用。

而在Flex當中若要接服務有三種方式:1.Http Service 2.Web Service 3.Remote Object,但這三項服務應該都不太會遇到上述問題,因為都會撰寫一個服務完成後的回應事件。而這次會出錯的原因是:所使用的服務為其他API所執行,忽略要處理服務回應的事件而導致。

-----------------------------------------------

我也好想RIA(打滾)。

2 則留言:

hyrum 提到...

不只是FLEX這樣,連JAVA也是多執行續,在multithread的程式架構中,很容易發生用類似trace or alert or System.out.println()這類方式去trace流程...

ola的家 提到...

之前也常用類似Alert的語法進行除錯,但沒有想過有後面Alert蓋住前一個Alert的情況。XD

張貼留言