2

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

谢谢阅读。

编辑:忘了提。这是针对服务器应用程序的,因此我无法暂停线程的执行,因为同时必须处理其他内容。此外,这种计时器机制也不会孤单。一次可能有数百甚至数千个并发计时器。

4

5 回答 5

6

我真的相信您对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

于 2012-06-09T18:22:49.097 回答
1

如果你有成百上千个这样的计时器,一些调度就可以完成这项工作。

你真的应该调查quartznet

许多并发计时器的性能不如我所经历的那样好,quartznet 会做。

如果你真的想在你的应用程序中拥有这些调度任务,也许这篇文章会给你一些想法Task Scheduler Class Library for .NET

于 2012-06-09T18:27:27.853 回答
0

使用计时器。

如果创建 1000 个计时器,虽然会有一点开销,但不会太多。计时器将完成他们的工作并在 3 分钟后触发一个事件。此外,如果您希望您的代码每 3 分钟重复一次,那么计时器是您的最佳选择。

于 2012-06-09T18:27:12.360 回答
0

计时器对于数百/数千人来说不是一个好的解决方案,因为计时器是一种有限的资源。

是否要从同一个应用程序调用所有方法?

如果是这样,我将创建一个包含日期时间和操作的小型存根类,并将委托与目标时间一起添加到要调用的方法中。然后在后台线程中循环遍历列表并在适当时调用代表(并明显删除它们)

另一种解决方案是为每个要调用的方法执行类似 QueueUserWorkItem 的操作,并且首先在线程中休眠适当的时间,直到调用该方法。

对于所有解决方案(我的解决方案和其他解决方案),请注意在与 GUI 交互时必须执行的任何封送处理,或者可能需要执行的任何锁定以避免线程并发问题

于 2012-06-09T18:27:26.353 回答
-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>
于 2017-11-17T17:00:44.613 回答