消息关闭
    暂无新消息!

关于C#编写定时程序

问题作者 : 司机2017-06-05发布
在学U3D,然后不想用里面的yield return new waitforsconds,就自己写了个计时程序。如下:
void Pause(int delayTime){
System.DateTime time = new System.DateTime ();
time = System.DateTime.Now;
int s;
do {
s = System.DateTime.Now.Second - time.Second;
} while(s < delayTime);
}
可是运行时发现一个很严重的问题,我把它放到别的方法里面,再放到Update()里面,结果很占内存,基本就是卡死。想问下原因。

7个回答

︿ 2
这是一个循环,update不是真的卡死了,而是一种假死现象,只有等update里面的do-while循环结束后才会执行下面的内容,可以考虑使用线程或者协程。
︿ 1
就算用了携程,你还是会有这些问题的,因为这是代码逻辑的问题。。。。。。。。。。。一个资深的程序员也会有很多代码逻辑问题的,只是他会选择坑比较少的代码,,尽量少分析每一句是什么问题,然后减少调试,要不调个几天,除了调通,得到优化的代码其实很少,写C++的重构和互相学习的机会会多点,但现在CPP的程序员也很渣的。。。。。没坚持个10年的CPP程序员什么都不是,但是你要是个坚持个10年的CPP,你脑子有问题
︿ 0
携程的好处我现在算是懂了
其实我写过LUA
GOLANG的携程
但是我就是不知道为什么那么多源码喜欢用携程,在UPDATE事件里
培训机构的老师是这样,某上市公司的商业源码也是
我用不用是无所谓的,或者C#也有更好的做法
我在我的博客好像也说过,我用C#用到2012年,那时候还不知道携程是什么鬼,C#一直跟JAVA是多线程不就好了嘛
结果脚本出来就有携程的,LUA如此,GOLANG也是如此,我怀疑JS也有携程,待求证
携程的概念也是手机UI至于WINDOWS很不同的地方,也可以说事超越了进程,事件这些旧的概念,这个在学校肯定不会教的
你那个满头白头发的老师只会让你做计时器,做个闹钟项目做为期末设计

那么多人用肯定有其原因
主要原因
就是要是你这些新人用,代码放到携程里(代码写很渣也无所谓),因为可以通过yield释放给主线程,就算携程慢,甚至崩了都无所谓
主线程占主导,占主要资源(也是就是LateUpdate,FixedUpdate)
做3D游戏,留多点资源给渲染,操作和通讯吧。。。。很合理
当你懂携程的时候自然而然也就会用了
也不会有你这些问题
(我也是在我博客里面说过,你让一个资深程序员写一个计时器,他可能真不够你快,甚至连TIMER怎么写都忘了,唯一他比你好的只是他选择的路比你选的路坑少而已,我在知乎回答得,好像是)
︿ 0
看到的现象是假卡死,这是一个循环,update不是真的卡死了,而是一种假死现象,只有等update里面的do-while循环结束后才会执行下面的内容。
︿ 0
update本来是一帧执行一次,但是你的while循环会让计算机在某一秒进入之后必须等while循环执行结束后才能出来,而上面的代码还有一个比较致命的地方就是你在进入 while循环这一帧前对 time = System.DateTime.Now;进行了赋值操作,但是在循环内部s = System.DateTime.Now.Second - time.Second;     System.DateTime.Now.Second 是随着时间变化的量,time.Second也是一个随着时间变化的量(已经测试过),也许你把time.second作为了一个常量了,而且两者的步长是一样的,  因此  s < delayTime用于成立。所以进入一个死循环。
以下的代码,我相信你会写,就是顺手粘下来了。
 
float timer = 0;
// Update is called once per frame
void Update () {
        timer += Time.deltaTime;
        if (timer > 100)
        {
            Debug.Log("时间到了");
        }
}
︿ 0
Update时while循环没有完,下一帧什么时候到来,肯定等你while循环完成了,你在update中循环实际上强制降低了帧率,低到你看到的现象是假卡死