Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实时同步定时器_C#_Winforms_Timer - Fatal编程技术网

C# 实时同步定时器

C# 实时同步定时器,c#,winforms,timer,C#,Winforms,Timer,我正在尝试使用计时器每隔17ms刷新帧 Timer timer = new Timer(17); timer.Elapsed += ResetFrame; timer.Start(); 但它不是等待17ms然后重复,而是等待帧刷新完成,然后等待17ms进行下一次重复。这会导致帧每隔28毫秒刷新一次。如何将其与实时同步?要使实时计时器具有很短的间隔,您可以阅读本文: 在.Net中,下列计时器不是实时的 System.Windows.Forms.Timer System.Timers.Timer

我正在尝试使用
计时器每隔
17ms
刷新帧

Timer timer = new Timer(17);
timer.Elapsed += ResetFrame;
timer.Start();

但它不是等待
17ms
然后重复,而是等待帧刷新完成,然后等待
17ms
进行下一次重复。这会导致帧每隔28毫秒刷新一次。如何将其与实时同步?

要使实时计时器具有很短的间隔,您可以阅读本文:

在.Net中,下列计时器不是实时的

System.Windows.Forms.Timer

System.Timers.Timer

System.Threading.Timer

意味着如果你想每100毫秒运行一次你的代码 计时器甚至可以在110毫秒或更晚的时间触发。Windows不是一个真正的应用程序 由于这个原因,时间操作系统.Net也不是实时的

要在C#中创建实时计时器,您必须编写自定义代码 可以控制CPU在正确的时间运行代码

类程序
{
静态void Main(字符串[]参数)
{
Console.ReadLine();
控制台。写入线(“运行”);
RealTimeTimerTest obj=新的RealTimeTimerTest();
obj.Run();
}
}
公共类实时测试
{
List lst=新列表();
System.Diagnostics.Stopwatch sw=新的System.Diagnostics.Stopwatch();
公开募捐
{
int Tick=100;
int Sleep=Tick-20;
长OldElapsedMilliseconds=0;
sw.Start();
同时(软件正在运行)
{
长elapsedmillesons=sw.elapsedmillesons;
长模式=(ElapsedMilliseconds%Tick);
如果(OldElapsedMilliseconds!=ElapsedMilliseconds&&(mod==0 | | ElapsedMilliseconds>勾选))
{
//-----------------在这里做你想做的事------------开始
lst.Add(DateTime.Now);
//-----------------在这里做你想做的事------------结束
//-----------------重新启动------------------启动
OldElapsedMilliseconds=ElapsedMilliseconds;
OldElapsedMilliseconds=0;
sw.Reset();
sw.Start();
系统。线程。线程。睡眠(睡眠);
//-----------------重新启动------------------结束
}
//------------必须在这里定义一些条件来中断循环------开始
如果(第一次计数>500)
{
Write();
打破
}
//-------------必须在这里定义一些条件来中断循环-----------结束
}
}
私有无效写入()
{
System.IO.StreamWriter sw=新的System.IO.StreamWriter(“d:\\text.txt”,true);
foreach(在lst中的日期时间dtStart)
sw.WriteLine(dtStart.ToString(“HH:mm:ss.ffffff”);sw.Close();
}
}
还认为:


您的UI线程正忙于执行处理程序(刷新我假设的帧)。它将如何继续执行您的处理程序,并同时开始再次执行它?您可以有一个,但我怀疑结果是否会是您期望的。@aepot@OlivierRogier我使用的是
System.Timers
;发现:&&&@OlivierRogier的代码解决了我的问题。非常感谢。