要在一个定时器运行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(); 

内部的代码,但在代码运行到监视器计时器这给了我一个例外:对象的同步方法被调用来自一个不同步的代码块。

有没有解决方法?或者我可以用其他方式实现我的目标?

谢谢!

+4

这是什么类型的应用程序?一个命令行应用程序?的WinForms? WPF?其他?如果你想让你的主线程阻塞,那你为什么还需要另一个线程呢? –

+0

对不起,我只使用Java,但这看起来非常类似于我在那里的问题 - 在java中,我将一个synchronized()块围绕着Monitor.enter()... C#是否有类似的构造? –

+0

WindForms。例如,代码行A,Timer.Start(),代码行B.我希望应用程序只能在完成定时器运行时才开始在B行运行。 –

如果你想在当前线程阻塞的一组时间跨度,您可以只使用了Thread.Sleep(时间跨度) https://msdn.microsoft.com/en-us/library/274eh01d(v=vs.110).aspx

你并不需要使用另一个线程。

+0

这不是一个完整的线程的东西。我认为计时器有时可以看作是一个线程,但在我的想象中,它是主线程的一部分,所以我最初的设计是当它运行时,主要应该等到它停止。 –

+0

我一直将c#定时器视为异步执行重复(或基于间隔)操作的机制。但是如果你想阻塞主线程直到定时器完成 - 你可以: 有主线程等待一个: https://msdn.microsoft.com/en-us/library/58195swd.aspx 并且有定时器会在完成时标记waithandle(在msdn页面上有一个例子) – Assaf

+0

如何锁定定时器?只需使用lock关键字来锁定一个对象并使括号围绕定时器? –