zoukankan      html  css  js  c++  java
  • C# 主线程 辅助线程

    主线程:
    就是UI线程;
    从主线程通过Thread.Start或AsyncDelegate.BeginEnvoke(可带参数、定义回调方法、避免轮询)将进入辅助线程;采用异步的方式调用委托可以在界面重绘时避免工作线程被阻塞;
    从主线程中调用委托的AsyncDelegate.EndEnvoke方法将进入辅助线程(EndInvoke()是阻塞方法,在回调方法中调用EndInvoke可以获得异步调用的方法的返回值),并等待结束。

    辅助线程:
    就是工作线程;
    从辅助线程通过调用任何控件的Controls.Invoke方法或Controls.BeginInvoke可以切换回到主线程;并将Invoke/BeginInvoke()中的那个object数组类型的参数传递给委托参数供委托作为参数执行。
    切记:AsyncDelegate.BeginEnvoke参数中的回调方法是在辅助线程中执行的,而不是在主线程中。这意味着你永远不要企图在类似的回调方法中去实现UI的更新!(这意味着回调方法同步调用的方法也在辅助线程中执行)


    控件的Invoke和BeginInvoke 方法所调用的委托无论如何都是在 UI 线程中执行的
    委托回调里调用EndInvoke是阻止主线程运行的.也就是说主线程要等BeginInvoke的线程执行完才执行.
    而回调方法的线程和委托方法的线程在一个线程上


    在新线程中运行程序的三种方法(下面例子中,Compute是封装耗时运算的类,通常Compute.GenXLRZ是个长时间任务需要在辅助线程中执行,GenXLRZ中通过调用OnUpdate引发事件Update;):
                Compute c = new Compute();
                c.Update += new Compute.UpdateEventHandler(c_Update);//c.Update 向主线程发送事件通知,通常用于更新界面

                //方法1直接用ThreadStart
                //Thread t = new Thread(new ThreadStart(c.GenXLRZ));
                //t.Start();

               //方法2比较灵活,可以有回调方法           
                //GenXLRZDelegate genXLRZ=new  GenXLRZDelegate(c.GenXLRZ);
                //genXLRZ.BeginInvoke(new System.AsyncCallback(this.EnableControl), null);//通过委托异步调用,回调EnableControl也是在新线程中运行

               //方法3用 ThreadPool,比较简单
                WaitCallback async = new WaitCallback(c.GenXLRZ);
                ThreadPool.QueueUserWorkItem(async, null);
    再次强调:BeginInvoke的回调方法this.EnableControl、辅助线程中执行的c.GenXLRZ方法中引发事件的响应方法c_Update都是运行在辅助线程上的,也就是不能直接访问UI控件(通过Control.Invoke的方式访问-这个方法总是切换到主线程上执行委托方法)

  • 相关阅读:
    Solaris 11 让 ls 的输出 带上颜色
    Solaris11 Vsphere client tool 的鼠标问题
    VNC Viewer连接Cent OS 时的 复制粘帖 功能
    vSphere Client的拷贝 粘帖 功能
    更改CentOS7登录画面的分辨率
    一个故意消耗内存的java程序MemoryEater
    安装CentOS7文字界面版后,无法联网,用yum安装软件提示 cannot find a valid baseurl for repo:base/7/x86_64 的解决方法
    windows 安装 Redis
    centos 安装postgresql 完整版
    centos 7 官网安装 PostgreSQL
  • 原文地址:https://www.cnblogs.com/ghfsusan/p/1956974.html
Copyright © 2011-2022 走看看