非同步呼叫底層的設計,Asynchronous Base Method

 

如果有寫過比較大的UI程式,一定需要用到非同步,因為使用者第一接觸就是UI界面,只要使用者感覺UI不順、有Hang住的感覺,一定會抱怨Orz。

之前我在寫的時候,一般都是另外開Thread來做運算,但麻煩的是算完之後要回報給MainThread的處理,都要知道MainThread的Class的名字來Callback,所以都是copy以前的code,ex: if(this.InvokeRequired){} 之類的,這樣都沒有一個通用的解決方案,今天在codeproject看到一個AsyncBaseClass.cs,終於學到怎麼寫通用的非同步呼叫。

流程如下,MainThread呼叫AsyncMethod,會把Dispatcher存起來
CallingDispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher,接下來開thread去做
System.Threading.ThreadPool.QueueUserWorkItem(MyMethodThreaded, parameters);
在MyMethodThreaded的最後再使用剛剛的Dispatcher來invoke
CallingDispatcher.BeginInvoke(
                new Action<int, object>(FireMyMethodCompleteEvent),
                result,
                parameters.CallerStateObject
            );

這樣FormMain就不會有甚麼很醜的Code了,ex: if(this.InvokeRequired)。

參考資料:http://www.codeproject.com/KB/threads/AsyncDemo.aspx

留言

這個網誌中的熱門文章

好貴的東元冷氣維修--馬達啟動電容

台大醫院 婁培人 耳鼻喉科 就診

機車無法充電之整流器壞掉--$650