zoukankan      html  css  js  c++  java
  • c#同步上下文SynchronizationContext学习笔记

    提供在各种同步模型中传播同步上下文的基本功能。同步上下文的工作就是确保调用在正确的线程上执行。

    同步上下文的基本操作

    Current 获取当前同步上下文

    var context = SynchronizationContext.Current;

    Send 一个同步消息调度到一个同步上下文。

    SendOrPostCallback callback = o =>
                                     {
                                         //TODO:
                                     };
    context.Send(callback,null);

    send调用后会阻塞直到调用完成。 
    Post 将异步消息调度到一个同步上下文。

    SendOrPostCallback callback = o =>
                                    {
                                          //TODO:
                                    };
    context.Post(callback,null);

      和send的调用方法一样,不过Post会启动一个线程来调用,不会阻塞当前线程。

    使用同步上下文来更新UI内容

    无论WinFromsWPF都只能用UI线程来更新界面的内容

    常用的调用UI更新方法是Inovke(WinFroms):

    private void button_Click(object sender, EventArgs e)
    {
           ThreadPool.QueueUserWorkItem(BackgroudRun);
    }
    
    private void BackgroudRun2(object state)
    {
                this.Invoke(new Action(() =>
                           {
                              label1.Text = "Hello Invoke";
                           }));
    }

    使用同步上下文也可以实现相同的效果,WinFroms和WPF继承了SynchronizationContext,使同步上下文能够在UI线程或者Dispatcher线程上正确执行

    System.Windows.Forms. WindowsFormsSynchronizationContext
    System.Windows.Threading. DispatcherSynchronizationContext

    调用方法如下:

    private void button_Click(object sender, EventArgs e)
    {
               var context = SynchronizationContext.Current; //获取同步上下文
               Debug.Assert(context != null);
               ThreadPool.QueueUserWorkItem(BackgroudRun, context); 
    }
    
    private void BackgroudRun(object state)
    {
        var context = state as SynchronizationContext; //传入的同步上下文
        Debug.Assert(context != null);
        SendOrPostCallback callback = o =>
                                          {
                                              label1.Text = "Hello SynchronizationContext";
                                          };
        context.Send(callback,null); //调用
    }

    使用.net4.0的Task 可以简化成

    private void button_Click(object sender, EventArgs e)
    {
                var  scheduler = TaskScheduler.FromCurrentSynchronizationContext(); // 创建一个SynchronizationContext 关联的 TaskScheduler
                Task.Factory.StartNew(() => label1.Text = "Hello TaskScheduler", CancellationToken.None,
                                      TaskCreationOptions.None, scheduler);
    }
  • 相关阅读:
    POJ 2299 UltraQuickSort(求逆序数,归并排序或者离散化+树状数组)
    HDU 4349 Xiao Ming's Hope(数学题)
    HDU 2222 Keywords Search(AC自动机的入门题)
    HDU 4341 Gold miner(分组的背包问题)
    HDU 2825 Wireless Password(AC自动机+状态压缩DP)
    POJ 2352 Stars(树状数组)
    HDU 4342 History repeat itself(数学规律)
    HDU 4345 Permutation(数学题,记忆化搜索)
    HDU 3247 Resource Archiver(AC自动机+状态压缩DP)
    RFC
  • 原文地址:https://www.cnblogs.com/weifeng123/p/10039100.html
Copyright © 2011-2022 走看看