最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Silverlight 跨線程的使用詳解

 更新時(shí)間:2013年05月14日 12:00:14   作者:  
本篇文章是對(duì)Silverlight跨線程的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

新建SL4 應(yīng)用程序,在MainPage下添加代碼:

<Button x:Name="btnThread1" Click="btnThread1_Click">Thread1</Button>

后臺(tái)代碼為:

復(fù)制代碼 代碼如下:

private void btnThread1_Click(object sender, RoutedEventArgs e)
        {
            new Thread(() =>
            {
                MessageBox.Show("Hello World");
            }).Start();
        }

如果你運(yùn)行程序,點(diǎn)擊按鈕,會(huì)得到下面的異常。

clip_image002

這個(gè)問(wèn)題的原因很簡(jiǎn)單:一個(gè)線程嘗試調(diào)用另一個(gè)線程的方法 解決這個(gè)異常的方式很簡(jiǎn)單,

1:使用DependencyObject.Dispatcher.BeginInvoke 方法:

復(fù)制代碼 代碼如下:

private void btnThread1_Click(object sender, RoutedEventArgs e)
        {
            new Thread(() =>
            {
                this.Dispatcher.BeginInvoke(() =>
                {
                    MessageBox.Show("Hello World");
                });
            }).Start();
        }

2:使用SynchronizationContext 對(duì)象
復(fù)制代碼 代碼如下:

private void btnThread1_Click(object sender, RoutedEventArgs e)
        {
            SynchronizationContext context = SynchronizationContext.Current;

            new Thread(() =>
            {
                context.Post((state) =>
                {
                    MessageBox.Show("Hello World");
                }, null);
            }).Start();
        }


但是這兩者都有一個(gè)缺陷,假設(shè)有多個(gè)線程,例如多線程的多線程:
復(fù)制代碼 代碼如下:

private void btnThread1_Click(object sender, RoutedEventArgs e)
        {
            new Thread(() =>
            {
                SynchronizationContext context = SynchronizationContext.Current;

                new Thread(() =>
                {
                    context.Post((state) =>
                    {
                        MessageBox.Show("Hello World");
                    }, null);
                }).Start();
            }).Start();
        }


雖然這里保存了context,但是因?yàn)閏ontext并不是UI線程的SynchronizationContext,所以還是會(huì)跑出異常。

所以提出了第三種方案:

1:新建靜態(tài)類(lèi)UISynchronizationContext,代碼如下:

復(fù)制代碼 代碼如下:

        /// <summary>
        /// UI線程的SynchronizationContext
        /// </summary>
        public static class UISynchronizationContext
        {
            public static SynchronizationContext Context { get; set; }
        }

修改App.Xaml.cs 代碼的構(gòu)造函數(shù),在構(gòu)造App的時(shí)候設(shè)置
復(fù)制代碼 代碼如下:

UISynchronizationContext.Context = SynchronizationContext.Current;

        public App()
        {
            this.Startup += this.Application_Startup;
            this.Exit += this.Application_Exit;
            this.UnhandledException += this.Application_UnhandledException;

            //保存UI線程同步上小文
            UISynchronizationContext.Context = SynchronizationContext.Current;

            InitializeComponent();
        }


使用的時(shí)候只需要:
復(fù)制代碼 代碼如下:

private void btnThread1_Click(object sender, RoutedEventArgs e)
        {
            new Thread(() =>
            {
                new Thread(() =>
                {
                    UISynchronizationContext.Context.Post((state) =>
                    {
                        MessageBox.Show("Hello World");
                    }, null);
                }).Start();
            }).Start();
        }

其實(shí)Silverlight 已經(jīng)提供了相似功能的類(lèi)了,它就是
System.Windows.Deployment
你完全可以將上面的代碼修改為:
復(fù)制代碼 代碼如下:

new Thread(() =>
            {
                new Thread(() =>
                {
                    //UISynchronizationContext.Context.Post((state) =>
                    // {
                    // MessageBox.Show("Hello World");
                    // }, null);

                    System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        MessageBox.Show("Hello World");
                    });
                }).Start();
            }).Start();

相關(guān)文章

  • WPF開(kāi)發(fā)技巧之花式控件功能擴(kuò)展詳解

    WPF開(kāi)發(fā)技巧之花式控件功能擴(kuò)展詳解

    這篇文章主要給大家介紹了關(guān)于WPF日常開(kāi)發(fā)之花式控件功能擴(kuò)展的相關(guān)資料,通過(guò)文中這個(gè)例子,我們可以對(duì)WPF的掌握會(huì)更深刻,需要的朋友可以參考下
    2021-07-07
  • c#下注冊(cè)表操作的一個(gè)小細(xì)節(jié)

    c#下注冊(cè)表操作的一個(gè)小細(xì)節(jié)

    c#下注冊(cè)表操作的一個(gè)小細(xì)節(jié)...
    2007-11-11
  • C# Record構(gòu)造函數(shù)的行為更改詳解

    C# Record構(gòu)造函數(shù)的行為更改詳解

    C# 9 中的record類(lèi)型是僅具有只讀屬性的輕量級(jí)、不可變數(shù)據(jù)類(lèi)型(或輕量級(jí)類(lèi)),下面這篇文章主要給大家介紹了關(guān)于C# Record構(gòu)造函數(shù)的行為更改的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • C#Button窗體常用屬性及事件詳解

    C#Button窗體常用屬性及事件詳解

    在本篇文章里小編給各位分享的是關(guān)于C#Button窗體常用屬性及事件詳解,需要的朋友們可以參考下。
    2020-03-03
  • C#超實(shí)用代碼段合集

    C#超實(shí)用代碼段合集

    這篇文章主要介紹了C#超實(shí)用代碼段合集,涉及C#針對(duì)圖標(biāo)、數(shù)學(xué)運(yùn)算、拼音、日期、時(shí)間及文件夾等的相關(guān)操作技巧,需要的朋友可以參考下
    2015-11-11
  • C#使用ADO.Net部件來(lái)訪問(wèn)Access數(shù)據(jù)庫(kù)的方法

    C#使用ADO.Net部件來(lái)訪問(wèn)Access數(shù)據(jù)庫(kù)的方法

    數(shù)據(jù)庫(kù)的訪問(wèn)是所有編程語(yǔ)言中最重要的部分,C#提供了ADO.Net部件用于對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn)。本文從最簡(jiǎn)單易用的微軟Access數(shù)據(jù)庫(kù)入手討論在C#中對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)。
    2015-09-09
  • C#實(shí)現(xiàn)發(fā)送手機(jī)驗(yàn)證碼功能

    C#實(shí)現(xiàn)發(fā)送手機(jī)驗(yàn)證碼功能

    之前基于c#實(shí)現(xiàn)手機(jī)發(fā)送驗(yàn)證碼功能很復(fù)雜,真正做起來(lái)也就那回事,不過(guò)就是一個(gè)post請(qǐng)求就可以實(shí)現(xiàn)的東西,今天小編把思路分享到腳本之家平臺(tái),供大家參考下
    2017-06-06
  • WinForm單例窗體用法實(shí)例

    WinForm單例窗體用法實(shí)例

    這篇文章主要介紹了WinForm單例窗體,結(jié)合實(shí)例形式分析了窗體的單例模式定義、實(shí)現(xiàn)與使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • C#實(shí)現(xiàn)接收QQ郵件的示例代碼

    C#實(shí)現(xiàn)接收QQ郵件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C#如何使用pop協(xié)議來(lái)實(shí)現(xiàn)一下接收QQ郵件的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-08-08
  • Unity?UGUI的MaskableGraphic可遮罩圖形組件介紹使用

    Unity?UGUI的MaskableGraphic可遮罩圖形組件介紹使用

    這篇文章主要為大家介紹了Unity?UGUI的MaskableGraphic可遮罩圖形組件介紹使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評(píng)論

廉江市| 崇仁县| 夏津县| 开原市| 揭东县| 陇川县| 偏关县| 敦煌市| 榕江县| 通州市| 宁陵县| 绩溪县| 景东| 河北区| 福安市| 宁晋县| 兴和县| 恩施市| 临潭县| 格尔木市| 增城市| 睢宁县| 乐平市| 若尔盖县| 漳平市| 大洼县| 阳泉市| 广丰县| 竹山县| 湟中县| 息烽县| 西华县| 南漳县| 湘潭市| 垦利县| 通许县| 江安县| 安岳县| 鹰潭市| 通河县| 彭水|