非同步呼叫底層的設計,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)。
留言