线程

1,vsvim插件加快速度------------https://www.jianshu.com/p/805f598ddaf0

2,_vimrc 在C:Usersmxb之中

3,

noremap是用于insert模式的非递归映射,
nnoremap是用于normal模式的非递归映射,
vnoremap是用于visual模式的非递归映射.

4,线程的概念

每个线程都有以下的概念
             线程内核对象:一个数据结构

            线程环境块:

                包含线程异常处理链首.每次进入一个try块就在链表首插入一个Node,在退出的时候,删除该节点.

                 包含线程的"线程本地存储数据"和图形设备接口和opengl图形使用的数据结构

             用户模式栈----存储传给方法的局部变量和实参.并且包含了方法返回时,线程应该从什么地方开始继续执行.

             内核模式栈----应用程序代码向内核模式函数传递实参时,还会使用内核模式栈.处于安全考虑,将从用户栈向内核栈拷贝.

             dll线程链接和线程分离通知

                      对于所有非托管dll,  在创建线程时,调用 非托管dll的DllMain函数,并且传递DLL_THREAD_ATTACH标志.

             当中止时,调用 DLL_THREAD_DETACH标志.

            


上下文切换------所以windows必须在系统中所有线程之间共享物理cpu. windows任何事件只将一个线程分配给一个cpu,那个线程能运行一个"时间片" quantum.时间片到期,windos就上下文切换到另一个线程:

                 1,将cpu寄存器的值保存到当前运行线程内核对象的一个内部上下文结构中

                 2,从线程集合中选出一个线程供调度.

                 3,将当前线程上下文值加载到cpu的寄存器中.windows大概30ms执行一次上下文切换.


5,进程优先级概念
IDle

Below Normal

Normal

Above Normal

High-------只有绝对必要的时候才使用High优先级.

Realtime.

7个线程优先级

Idle,Lowest,Below Normal,Normal,Above Normal,Highest,Time-Critical.相对于进程优先级.

其实进程优先级只是便于理解.其进行了优先级映射.


6,前台进程和后台进程.一个进程的前台线程停止时,强制终止仍然运行的任何后台线程.不抛出异常.

设定线程的background属性.


7,聊一聊 t= Task.ContinueWith( ()=>....)

   和  t= Task.ContinueWith(async ()=>…)


区别 : 使用 await或者wait指令时,当两个匿名函数出现异常的时候

前者, 可以使用  t.wait 捕捉到.

后者,产生异常会包装再 t.Result里面(注意,t.Result也是一个Task类型的).所以,需要写成.t.result;

 public static async Task< bool>  WritePLC(Recipe rep, PlcInfoElement infoElement, CancellationToken token)
        {
                       Recipe curRecipe = Recipe.StaticInstance;//引用配方
            Plc plc = new Plc(infoElement.TYPE, infoElement.IP, infoElement.Rack, infoElement.Slot);

            Task openTask = plc.OpenAsync();
            Task<Task> writeTask = openTask.ContinueWith(task =>
            {
            if (openTask.IsFaulted) throw openTask.Exception;
                MessageBox.Show(".........");
             return plc.WriteBytesAsync(infoElement.DataType, infoElement.DB, infoElement.Start, PlcClassByProperty.ToBytes(curRecipe));

            }
               , token, TaskContinuationOptions.None , TaskScheduler.Default);


            try
            {
                writeTask.Wait();
                MessageBox.Show(writeTask.Status.ToString());

                await writeTask;
                return true;
            }
            catch (Exception ex)
            {

                MessageBox.Show( ex.Message+"xxx "+ ex.GetType().ToString());

            }
            finally
            {
                plc.Close();

            }

            return false;
        }
原文地址:https://www.cnblogs.com/frogkiller/p/12458136.html