在我的项目中,我希望能够在3分钟过后调用一个方法。没有“主循环”可以说,所以我不能使用秒表并不断检查是否已经过了3分钟。我能想到的唯一其他解决方案是一个间隔为3分钟的Timer对象,但这似乎相当混乱,因为它只会在3分钟延迟后调用一次。
感谢阅读。
编辑:忘了提。这是一个服务器应用程序,所以我不能暂停执行该线程,因为其他东西必须在此期间处理。此外,这个计时器机制不会是孤立的。一次可能有数百甚至数千个并发计时器。
答案 0 :(得分:7)
我真的相信你对Timer
对象的想法是正确的方法。听起来你对如何使用它很熟悉 - 但这是一个例子:
aTimer = new System.Timers.Timer(1000 * 60 * 3);
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Enabled = true;
http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx
答案 1 :(得分:1)
如果你有数百或数千个这样的计时器,一些计划将完成这项工作。
你真的应该调查quartznet
很多并发计时器的表现并不像我所经历的那样,quartznet会这样做。如果你真的想在你的应用程序中安排这些计划任务,也许这篇文章会给你一些想法Task Scheduler Class Library for .NET
答案 2 :(得分:0)
使用计时器。
如果您创建1000个计时器会有轻微的开销,但不会太多。定时器将完成他们的工作,并在3分钟过后发动事件。此外,如果您希望您的代码每3分钟重复一次,那么定时器就是您的选择。
答案 3 :(得分:0)
计时器不是数百/数千的好解决方案,因为计时器是有限的资源。
是否要从同一个应用程序调用所有方法?
如果是这样,我将创建一个具有日期时间和Action的小存根类,并将委托添加到要调用的方法以及目标时间。然后在后台线程循环遍历列表并在适当时调用代理(并显然删除它们)
另一种解决方案是为每个要调用的方法执行类似QueueUserWorkItem的操作,并且线程中的第一件事在适当的时间内休眠,直到应该调用该方法。
对于所有解决方案(我和其他人),请注意在与GUI交互时必须执行的任何编组,或者为避免线程并发问题可能需要执行的任何锁定
答案 4 :(得分:-3)
尝试了几个选项后,该方法不是自触发的。因此,我使用Javascript解决了如下所示的相同问题。
<script>
function Timer() {
$.ajax({
url: "@Url.Action("Timer", "Exam")",//Method to call. Timer Method in Exam Controller
type: 'GET', // <-- make a async request by GET
dataType: 'html', // <-- to expect an html response
cache: false,
async: true
});
}
setInterval(function () { Timer(); }, 5000);//Triggers method Timer() after 5 seconds
</script>