这么多秒后如何调用方法?

时间:2012-06-09 18:21:01

标签: c#

在我的项目中,我希望能够在3分钟过后调用一个方法。没有“主循环”可以说,所以我不能使用秒表并不断检查是否已经过了3分钟。我能想到的唯一其他解决方案是一个间隔为3分钟的Timer对象,但这似乎相当混乱,因为它只会在3分钟延迟后调用一次。

感谢阅读。

编辑:忘了提。这是一个服务器应用程序,所以我不能暂停执行该线程,因为其他东西必须在此期间处理。此外,这个计时器机制不会是孤立的。一次可能有数百甚至数千个并发计时器。

5 个答案:

答案 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>