a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

淺談Silverlight 跨線程的使用詳解

2020-01-24 03:20:04
字體:
來源:轉載
供稿:網友

新建SL4 應用程序,在MainPage下添加代碼:

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

后臺代碼為:

復制代碼 代碼如下:

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

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

clip_image002

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

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

復制代碼 代碼如下:

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

2:使用SynchronizationContext 對象
復制代碼 代碼如下:

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

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


但是這兩者都有一個缺陷,假設有多個線程,例如多線程的多線程:
復制代碼 代碼如下:

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:新建靜態類UISynchronizationContext,代碼如下:

復制代碼 代碼如下:

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

修改App.Xaml.cs 代碼的構造函數,在構造App的時候設置
復制代碼 代碼如下:

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();
        }


使用的時候只需要:
復制代碼 代碼如下:

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

其實Silverlight 已經提供了相似功能的類了,它就是
System.Windows.Deployment
你完全可以將上面的代碼修改為:
復制代碼 代碼如下:

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();

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 日韩成人| 97成人在线免费视频 | 免费不卡视频 | 中文在线播放 | 亚洲免费在线观看 | 久久久91精品国产一区二区精品 | 性高湖久久久久久久久 | 国产三级在线播放 | 日韩激情网站 | 国产片侵犯亲女视频播放 | 日韩欧美一级精品久久 | 日韩成人久久 | 日本一本视频 | 国产精品成人免费一区二区视频 | 十八岁禁看网站 | 欧美综合一区二区三区 | 97精品在线 | 午夜免费小视频 | 亚洲视频综合 | 谁有毛片| 美日韩在线 | 97精品国产| 四虎av| 国产在线拍偷自拍观看视频网站 | 一区二区三区回区在观看免费视频 | 成人三级在线 | 精品一区二区三区免费毛片爱 | 欧美综合一区二区 | 一区二区三区日韩 | 国产精品永久免费自在线观看 | 成人欧美一区二区三区白人 | 亚洲一区二区视频免费观看 | 天天视频成人 | 日日操人人 | 国产在线a | 欧美午夜一区二区三区免费大片 | 久久久久国产一级毛片高清版小说 | 国产一区二区三区四区在线观看 | 99re在线观看 | 成人黄色精品 | 欧美日韩第一页 |