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

淺談Silverlight 跨線程的使用詳解

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

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

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

后臺代碼為:

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

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

如果你運行程序,點擊按鈕,會得到下面的異常。

clip_image002

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

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 對象
復(fù)制代碼 代碼如下:

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

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


但是這兩者都有一個缺陷,假設(shè)有多個線程,例如多線程的多線程:
復(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,但是因為context并不是UI線程的SynchronizationContext,所以還是會跑出異常。

所以提出了第三種方案:

1:新建靜態(tà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è)置
復(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();
        }


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

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

其實Silverlight 已經(jīng)提供了相似功能的類了,它就是
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開發(fā)技巧之花式控件功能擴展詳解

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

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

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

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

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

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

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

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

    C#超實用代碼段合集

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

    C#使用ADO.Net部件來訪問Access數(shù)據(jù)庫的方法

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

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

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

    WinForm單例窗體用法實例

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

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

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

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

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

最新評論

韶关市| 特克斯县| 资溪县| 白水县| 大宁县| 武平县| 彭泽县| 新建县| 永修县| 高尔夫| 大冶市| 弥渡县| 鹤壁市| 遂平县| 富顺县| 五原县| 修水县| 格尔木市| 遵化市| 梁平县| 竹山县| 金平| 枣庄市| 东明县| 灯塔市| 长岛县| 福安市| 南涧| 花垣县| 岑溪市| 琼中| 土默特左旗| 五常市| 泉州市| 昌邑市| 宁晋县| 荆州市| 九龙坡区| 嘉荫县| 马关县| 清水河县|