线程
1,vsvim插件加快速度------------https://www.jianshu.com/p/805f598ddaf0
2,_vimrc 在C:\Users\mxb之中
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,进程优先级概念
IDleBelow 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; }