好了,時間讓我問我的第一個問題就在這裏.......NET CF 3.5窗體交談以僅同步網絡設備
我創造了許多意見(CF 3.5用戶控件,使用OpenNETCF。 IoC和resco控制)以及它們的導航控制器。
我還爲一個相當好奇的專有網絡設備創建了一個抽象層(「驅動程序」)。命令只能在設備上同步執行,但我使用讀取器線程來偵聽來自設備的消息(可能隨時出現,或者響應同步命令)。這些消息可以在事件中分派或排隊。
有點像這樣,在 「驅動器」 的接口:
public Response ExecuteCommand(Command command);
< =這是同步調用。有些命令可能會運行幾分鐘。
public event DeviceMessageReceivedEvent;
< =如果這是訂閱的,那麼不是直接回復對上述方法的調用的傳入消息將被分派到事件參數中。這將從讀者線程中調用。
public Queue DeviceMessages;
< =如果事件未訂閱,此類消息將轉到此處。
還有一個方便的應用程序外觀,但它基本上只是ExecuteCommand調用的一個花哨的包裝,因此我將在此省略它。
問題:
我怎麼會在活動和/或隊列中接收到的意見,最好的線了數據,以及如何將我最好的實現在ExecuteCommand方法的異步包裝 - 只是重申其,由於設備的網絡協議的限制(是的,它確實是非常可怕的)必須同步運行。)
在閱讀了很多有關使用.NET CF 3.5 WinForms進行異步編程之後,我不知如何繼續。在第一個演示中,我使用了DataBindings,但這導致了在需要時沒有明顯的方式使用Control.Invoke的問題。我還通過與UI線程同步執行所有命令並使用匿名線程而不是使用事件輪詢隊列上的消息來解決異步執行問題。這個我很想改變原因很明顯。
CF不提供BeginInvoke和EndInvoke,但我想這些會很簡單,重新實現?
我應該創建一個靜態視圖中心模型嗎?這甚至會簡化事宜嗎?
我應該創建一個額外的「inbetween」線程來處理model/view和driver之間的狀態轉移嗎?這甚至會簡化事宜嗎?
...?
我想我在這裏尋找一些關於一般設計原則的頭腦風暴。我從來沒有太多的用戶界面人員,大多數人一直在做系統編程,從來沒有更多的.NET比我可以避免。異步編程的概念非常清晰,而不是如何在這種情況下應用它們。
所以..任何輸入讚賞,也書推薦等...
肯定有一些similiarities那裏。我甚至正在考慮今天創建類似於TxThread的東西。謝謝您的意見。另外,如果你是我認爲你的ctacke,你的着作對我來說已經非常有價值。謝謝你。 –
小小更新:我正在積極研究這個問題,並最終將「正確回答」我自己的問題,以便讓其他人獲益。從你的抽象描述中我猜你正在做類似modbus/tcp的事情。相信我,這更糟,協議是專有的,並以各種方式和地點破碎。很多時間都會進入這個領域以及其他領域,所以我不能投入大量時間來構建良好的架構。從你發佈的內容派生出的模式是有道理的,但我需要做明確的異步內容。我剛剛記下了一些僞代碼,並將在明天下班後再次發佈。 –
此刻我正在做zigbee,但是,我過去做過modbus。如果你的工作更糟糕,那麼你有我的同情心。 – ctacke