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

use*_*410 3 .net c# multithreading sleep playstation

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

我有这个代码:

UISystem.SetScene(Scene_Menu);
Thread.Sleep (9000);
p.Text="HELLO";
Thread.Sleep(9000);
p.Text="WORLD";
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

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

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

Eri*_*ert 17

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

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

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

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

此外:是的,的DoEvents会画画你的控制,但这是所有会做.在接下来的九秒钟内,应用程序将显示给用户完全挂起.这是一个非常糟糕的用户体验.

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

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

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

UISystem.SetScene(Scene_Menu); 
await Task.Delay (9000); 
p.Text="HELLO"; 
await Task.Delay(9000); 
p.Text="WORLD"; 
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 只有在使用正确的计时器类型时,计时器的处理程序才会在UI线程上运行:例如Winforms的`System.Windows.Forms.Timer`或WPF的`System.Windows.Threading.DispatcherTimer`.我不知道PS Vita的正确计时器是什么. (2认同)