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

This entry was posted in 電腦和網際網路. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s