Silverlight Interop 4-小試Silverlight多執行緒

上回的文章裡,測試過傳入Javascript Function當作參數,Thread.Sleep五秒後由Silverlight端呼叫。不過,眼尖的人應該有發現,在Thread.Sleep的五秒期間,網頁被卡死無法操作,而第二、三次傳入非Function呼叫的錯誤警告,也被排在五秒後才執行,換言之,整個程序是以同步方式執行。

咦,Siverlight不是支援多執行緒? 這可是跟Javascript嗆聲"閃開,讓專業的來"的絕佳時機呀! 要在Silverlight中加入多執行緒能力一點都不難,先前介紹過Thread.QueueUserWorkItem的Lamba寫法,語法物件都可直接搬來用,加個兩行就搞定嚕。Silverlight跟.NET同文同種的好處在此展現無遺!

        [ScriptableMember]
        public void CallbackTest(ScriptObject cb)
        {
            if (IsFunction(cb))
            {
                ThreadPool.QueueUserWorkItem((o) =>
                {
                    Thread.Sleep(5000);
                    cb.InvokeSelf("Darkthread");
                });
            }
            else
                HtmlPage.Window.Alert(cb.Invoke("toString").ToString() +
                                      " is not a function!");
        }

不過,上段程式有點小問題。第二、三測試的錯誤訊息會先彈出沒錯,證明測試一確實是在另一條執行緒中執行,但cb.InvokeSelf()時卻會彈出Invalid cross-thread access exception! Yes,在Silverlight裡也必須考量UI Thread Issue

這是預期內的問題,解決方法也很簡單,將會更動UI的操作包在ScriptObject.Dispatcher.BeginInvoke中即可。於是我們可以看到測試二、三先行,接著出現測試一的結果,多執行緒成功!

        [ScriptableMember]
        public void CallbackTest(ScriptObject cb)
        {
            if (IsFunction(cb))
            {
                ThreadPool.QueueUserWorkItem((o) =>
                {
                    Thread.Sleep(5000);
                    //Avoid Invalid cross-thread access exception
                    cb.Dispatcher.BeginInvoke(() =>
                    {
                        cb.InvokeSelf("Darkthread");
                    });
                });
            }
            else
                HtmlPage.Window.Alert(cb.Invoke("toString").ToString() +
                                      " is not a function!");
        }

Silverlight Rocks!!!

歡迎推文分享:
Published 04 May 2010 07:34 AM 由 Jeffrey
Filed under: ,
Views: 8,877



意見

# Will 保哥 said on 07 May, 2010 11:48 AM

你標題打錯字了,應該是 Silverlight 才對

# Jeffrey said on 07 May, 2010 03:09 PM

to Will 保哥,

哪有? 哪有? 明明是對的(顯示為己偷偷改正且死不認錯)。

開玩笑的,非常謝謝你的指正!!

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<May 2010>
SunMonTueWedThuFriSat
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication