obsidian/笔记文件/2.笔记/107TickTimer服务端测试案例(二).md
2025-03-26 00:02:56 +08:00

3.0 KiB
Raw Permalink Blame History

!Pasted image 20220731200247.png

先把之前的时间延迟,改回去;

!Pasted image 20220731200551.png

运行之后根据打印信息可以看到除了第一个线程id是1其他线程id都是5

!Pasted image 20220731200654.png

回到构造函数可以看到如果延迟不为空的话实际上是一直在while循环里面跑UpdateTask()的方法;

!Pasted image 20220731200835.png

根据这个false的传参也就可以知道方法体是不会放到前面定义的队列里面

!Pasted image 20220731200954.png

在taskDic里面遍历循环满足条件的任务执行相关的回调函数

!Pasted image 20220731201337.png

而这些一系列操作都是属于这个new出来的线程的id也就是打印信息里面的id为5的线程

!Pasted image 20220731201713.png

弄一个新的函数出来将第二个传参改成true也就是方法体会放到一个queue队列中统一处理

!Pasted image 20220731201750.png

如果是true的情况就是会调用一下这个HandleTask的函数去调用对应队列中的回调方法

!Pasted image 20220731202023.png

再跑一个异步的任务方法;

!Pasted image 20220731202126.png

可以看到线程id是不停变化的

!Pasted image 20220801130142.png

可以看到task的异步调用是从队列里拿数据包的cb委托去invoke出发调用

这个过程,是在线程池里,自动去调度,这个是无法通过程序控制的;

!Pasted image 20220801130614.png

继续修改传参第一个延迟的参数设置成0第二个sethandle相关的布尔也设置成false这样就是不会创建队列了

!Pasted image 20220801130835.png

在异步调用的方法里也修改一下调用的方法接口不使用HandleTask()的方式而是直接使用UpdateTask()的形式;

!Pasted image 20220801131001.png

可以看到,调用的线程,是不断变化的,也就是自动在线程池里面,不断自动用不同的线程去调度, 补充一下UpdateTask()相关方法:

参考104循环任务时间修正

!Pasted image 20220801131409.png

继续如果把这个await延迟去掉

!Pasted image 20220801131445.png

这时候,实际上,就是变成了,同步执行的方式了;

!Pasted image 20220801131608.png

重新运行可以看到线程id都是同一个了而且间隔差变成0了

!Pasted image 20220801131710.png

继续修改参数把第二个setHandle的参数设置为true也就是又会把回调都放在queue队列里

!Pasted image 20220801131836.png

队列任务的执行是在这个HandleTask()里面执行的,所以,又取消注释;

!Pasted image 20220801132009.png

可以看到,也都是在同一个线程中,执行的;

!Pasted image 20220801132042.png

再取消这个await的注释

!Pasted image 20220801132133.png

重新运行,可以看到,又自动调度到,不同的线程了;