在我的项目中,我希望能够在 3 分钟后调用一个方法。没有“主循环”可言,所以我不能使用秒表并不断检查 3 分钟是否已经过去。我能想到的唯一其他解决方案是间隔为 3 分钟的 Timer 对象,但这似乎相当混乱,因为它只会在 3 分钟延迟后调用一次。
谢谢阅读。
编辑:忘了提。这是针对服务器应用程序的,因此我无法暂停线程的执行,因为同时必须处理其他内容。此外,这种计时器机制也不会孤单。一次可能有数百甚至数千个并发计时器。
在我的项目中,我希望能够在 3 分钟后调用一个方法。没有“主循环”可言,所以我不能使用秒表并不断检查 3 分钟是否已经过去。我能想到的唯一其他解决方案是间隔为 3 分钟的 Timer 对象,但这似乎相当混乱,因为它只会在 3 分钟延迟后调用一次。
谢谢阅读。
编辑:忘了提。这是针对服务器应用程序的,因此我无法暂停线程的执行,因为同时必须处理其他内容。此外,这种计时器机制也不会孤单。一次可能有数百甚至数千个并发计时器。
我真的相信您对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
如果你有成百上千个这样的计时器,一些调度就可以完成这项工作。
你真的应该调查quartznet
许多并发计时器的性能不如我所经历的那样好,quartznet 会做。
如果你真的想在你的应用程序中拥有这些调度任务,也许这篇文章会给你一些想法Task Scheduler Class Library for .NET
使用计时器。
如果创建 1000 个计时器,虽然会有一点开销,但不会太多。计时器将完成他们的工作并在 3 分钟后触发一个事件。此外,如果您希望您的代码每 3 分钟重复一次,那么计时器是您的最佳选择。
计时器对于数百/数千人来说不是一个好的解决方案,因为计时器是一种有限的资源。
是否要从同一个应用程序调用所有方法?
如果是这样,我将创建一个包含日期时间和操作的小型存根类,并将委托与目标时间一起添加到要调用的方法中。然后在后台线程中循环遍历列表并在适当时调用代表(并明显删除它们)
另一种解决方案是为每个要调用的方法执行类似 QueueUserWorkItem 的操作,并且首先在线程中休眠适当的时间,直到调用该方法。
对于所有解决方案(我的解决方案和其他解决方案),请注意在与 GUI 交互时必须执行的任何封送处理,或者可能需要执行的任何锁定以避免线程并发问题
在尝试了几个选项后,该方法不是自触发的。因此,我使用 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>