要在一个定时器运行C#
我试图做一个计时器的东西在一个循环中,定时器完成其工作后,应用程序启动的循环另一个轮阻塞主线程。但是因为我不知道如何在定时器运行时要求主线程停止运行,主线程立即进入下一个转向。要在一个定时器运行C#
我做了一些关于锁。
这是循环
for (int i = 0; i < step; i++)
{
Monitor.Enter(locker);
//start timer
}
则定时器
t_tick = (senders, args) =>
{
if (condition)
{
//do something
}
else
{
//do something
Monitor.Exit(AirplaneManager.locker);
t.Stop();
}
};
t.Tick += t_tick;
t.Interval = 30;
t.Start();
内部的代码,但在代码运行到监视器计时器这给了我一个例外:对象的同步方法被调用来自一个不同步的代码块。
有没有解决方法?或者我可以用其他方式实现我的目标?
谢谢!
如果你想在当前线程阻塞的一组时间跨度,您可以只使用了Thread.Sleep(时间跨度) https://msdn.microsoft.com/en-us/library/274eh01d(v=vs.110).aspx
你并不需要使用另一个线程。
这不是一个完整的线程的东西。我认为计时器有时可以看作是一个线程,但在我的想象中,它是主线程的一部分,所以我最初的设计是当它运行时,主要应该等到它停止。 –
我一直将c#定时器视为异步执行重复(或基于间隔)操作的机制。但是如果你想阻塞主线程直到定时器完成 - 你可以: 有主线程等待一个: https://msdn.microsoft.com/en-us/library/58195swd.aspx 并且有定时器会在完成时标记waithandle(在msdn页面上有一个例子) – Assaf
如何锁定定时器?只需使用lock关键字来锁定一个对象并使括号围绕定时器? –
这是什么类型的应用程序?一个命令行应用程序?的WinForms? WPF?其他?如果你想让你的主线程阻塞,那你为什么还需要另一个线程呢? –
对不起,我只使用Java,但这看起来非常类似于我在那里的问题 - 在java中,我将一个synchronized()块围绕着Monitor.enter()... C#是否有类似的构造? –
WindForms。例如,代码行A,Timer.Start(),代码行B.我希望应用程序只能在完成定时器运行时才开始在B行运行。 –