国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C# > 正文

淺談Silverlight 跨線程的使用詳解

2020-01-24 03:20:04
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

新建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)類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)提供了相似功能的類了,它就是
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();

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 九龙城区| 简阳市| 天津市| 津市市| 廊坊市| 湖南省| 益阳市| 永新县| 搜索| 庆云县| 宣汉县| 陇川县| 宁河县| 西和县| 临夏县| 庆云县| 凌海市| 康平县| 镶黄旗| 香港| 横峰县| 都匀市| 枣庄市| 阿合奇县| 宽甸| 清丰县| 句容市| 砚山县| 赣榆县| 西乌| 饶阳县| 景东| 娱乐| 延寿县| 莱阳市| 永济市| 崇阳县| 新宾| 磐石市| 张北县| 兴仁县|