编程语言
首页 > 编程语言> > System.Threading睡眠功能有帮助吗? (C#)

System.Threading睡眠功能有帮助吗? (C#)

作者:互联网

我是C#的新手,我正在使用System.Threading.

我有这个代码:

UISystem.SetScene(Scene_Menu);
Thread.Sleep (9000);
p.Text="HELLO";
Thread.Sleep(9000);
p.Text="WORLD";

它延迟了18秒,但是睡眠功能之间没有显示p.Text =“HELLO”.我的代码有什么问题?

谢谢.

定时器不起作用,因为我无法从单独的线程编辑p.

Application.DoEvents()是一个Windows窗体函数,我正在PS Vita中构建一个应用程序.

解决方法:

您已经发现了为什么不应该使用Thread.Sleep.它只对两件事有用. (1)编写需要模拟线程忙碌一定秒数的测试用例,以及(2)睡眠零毫秒告诉操作系统“如果有一个进程,我将剩余的时间切换到另一个进程想要它“;这是礼貌的事情.

你应该永远不要使用thread.Sleep来引入一个延迟,正如你所发现的那样.您正在设置属性,但设置属性不会导致操作系统重新绘制屏幕.考虑一下;你可能在一个方法中有一千个属性集,并且你必须在所有这些之后重新绘制屏幕,​​这看起来很难看并且非常慢.

相反,所发生的是属性设置,并且该对象向操作系统发出一个注释,说明该线程何时可用于再次处理操作系统消息,请重新绘制.你的程序是,而不是告诉操作系统“我已经完成了,继续查看是否有任何消息给我”,而不是你希望线程在9秒钟内什么都不做.

现在,您可以通过调用DoEvents来告诉程序检查消息,但使用DoEvents也是一个坏主意,您不应该这样做.这样做基本上会导致您的程序出现注意力缺陷症状;你没有完成当前的工作,你正在寻找是否有新的工作要做,而不从调用堆栈中删除旧的工作!假设那些新工作依次被中断,依此类推,等等.堆栈无限制地增长,这是非常糟糕的. DoEvents是一种“最糟糕的做法”,就像睡觉一样.你可以在简单的小程序中使用它,但是当程序变得复杂时会导致很大的麻烦.

而且:是的,DoEvents会绘制你的控件,但就是这样.在接下来的九秒钟内,应用程序将显示给用户完全挂起.这是一个非常糟糕的用户体验.

如果你想引入延迟,正确的做法是异步等待.在C#4及更早版本中,标准的方法是创建一个计时器,当计时器打勾时,做下一件事.

现在,您说您不能使用计时器,因为您需要从UI线程访问控件.没关系.计时器的tick事件处理程序将在UI线程上运行,而不是在单独的线程上运行.您可以安全地使用计时器.

在C#5中,正确的做法是使用新的await关键字来引入异步等待.也就是说,等待时等待其他东西的等待,而不是在等待时进入睡眠状态.在C#5中,您可以将代码编写为:

UISystem.SetScene(Scene_Menu); 
await Task.Delay (9000); 
p.Text="HELLO"; 
await Task.Delay(9000); 
p.Text="WORLD"; 

C#5目前处于测试阶段;有关此新功能的详细信息,请参阅:

http://msdn.microsoft.com/en-us/async

有关异步的简单介绍以及为什么DoEvents是坏消息的解释,请参阅我的MSDN杂志文章:

http://msdn.microsoft.com/en-us/magazine/hh456401.aspx

标签:c,net,sleep,multithreading,playstation
来源: https://codeday.me/bug/20190712/1444405.html