C# 延迟后执行一个方法?

C# 延迟后执行一个方法?,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我正在编写一个MVC4Windows服务,它接收消息,分析消息并发送响应。在某些情况下,我希望响应延迟几分钟。我知道如何使用System.Threading.Timer在延迟后执行方法,但我认为当处理方法结束时,对计时器对象的任何引用都将消失,从而允许对计时器进行垃圾收集,对吗 我已经决定我需要在某个地方保留一个计时器的静态列表,在创建计时器时添加一个引用,在调用回调方法时删除它(并调用timer.Dispose()) 有更简单的方法吗?您可以使用Thread.Sleep()方法 // Wait

我正在编写一个MVC4Windows服务,它接收消息,分析消息并发送响应。在某些情况下,我希望响应延迟几分钟。我知道如何使用
System.Threading.Timer
在延迟后执行方法,但我认为当处理方法结束时,对计时器对象的任何引用都将消失,从而允许对计时器进行垃圾收集,对吗

我已经决定我需要在某个地方保留一个计时器的静态列表,在创建计时器时添加一个引用,在调用回调方法时删除它(并调用timer.Dispose())


有更简单的方法吗?

您可以使用
Thread.Sleep()
方法

// Wait 5 seconds ...
Thread.Sleep(5000);

// Execute delayed code here.

您可以使用
Thread.Sleep()
方法

// Wait 5 seconds ...
Thread.Sleep(5000);

// Execute delayed code here.

首先,你应该读菲尔·哈克的文章

然后假设您真的想这样做,让web应用程序在
global.asax
方法
application\u start()
中启动一个计时器,这样它将以您想要的频率启动。计时器应该是应用程序本身的静态属性,调用的事件处理程序也应该是应用程序的静态方法

您还需要一个需要处理的项目优先级队列,其中每个项目都有其到期日期/时间的时间戳,优先级是到期日期/时间。不要忘记同步对队列的访问

要将某些内容排队等待以后的传递,web方法应该向队列中添加一个项目


每次事件处理程序激发时,它都会查看队列的头部以查找需要处理的项。如果找到一个队列,它会将其删除、处理并重复,直到窗口过期、队列为空或队列头尚未到期。

首先,您应该阅读Phil Haack的文章

然后假设您真的想这样做,让web应用程序在
global.asax
方法
application\u start()
中启动一个计时器,这样它将以您想要的频率启动。计时器应该是应用程序本身的静态属性,调用的事件处理程序也应该是应用程序的静态方法

您还需要一个需要处理的项目优先级队列,其中每个项目都有其到期日期/时间的时间戳,优先级是到期日期/时间。不要忘记同步对队列的访问

要将某些内容排队等待以后的传递,web方法应该向队列中添加一个项目


每次事件处理程序激发时,它都会查看队列的头部以查找需要处理的项。如果找到一个,它会将其删除、处理并重复,直到其窗口过期、队列为空或队列头尚未到期。

一个合适的解决方案是在服务器发送响应时不让客户端等待几分钟。从技术上讲,它可以在客户端触发超时,让调用异步,并执行您在服务器端执行的任何操作,并且有一个标志让客户端知道它已完成,客户端可以定期轮询您的服务(可能每30秒一次)找出工作是否已准备就绪并完成。

一个合适的解决方案是不要让客户端在服务器发送响应时等待几分钟。从技术上讲,它可以在客户端触发超时,让调用异步,并执行您在服务器端执行的任何操作,并且有一个标志让客户端知道它已完成,客户端可以定期轮询您的服务(可能每30秒一次)看看工作是否准备好并完成。

我是否阅读了正确的
MVC4 windows服务
?是的,正如我导师建议的那样。就像我说的,我是n00b。:)我的知识正在提高(如果不是我的判断的话),这实际上是一个Web API Windows服务。+1感谢在这么长时间之后回到这篇文章并更新我们:)我是否阅读了正确的
MVC4 Windows服务
?是的,正如我导师推荐的那样。就像我说的,我是n00b。:)我的知识正在提高(如果不是我的判断的话),这实际上是一个Web API Windows服务。+1感谢你在这么长时间后回到这篇文章并更新我们:)首先,感谢你花这么多时间在一个答案上。你显然对这个平台有很深的了解。但是,我不需要重复性任务,只需要一次延迟动作。你当然是对的,定期服务的优先级队列可以解决我的问题,但我是一个懒惰的b****rd,我正在寻找一些简单的,适合我的具体问题。(我保留在我实际准备好您的链接文章后修改此回复的权利。)请阅读文章,再次感谢!当一个博主给他的诽谤注入幽默感时,这总是很好的!首先,谢谢你花了这么多时间在一个答案上。你显然对这个平台有很深的了解。但是,我不需要重复性任务,只需要一次延迟动作。你当然是对的,定期服务的优先级队列可以解决我的问题,但我是一个懒惰的b****rd,我正在寻找一些简单的,适合我的具体问题。(我保留在我实际准备好您的链接文章后修改此回复的权利。)请阅读文章,再次感谢!当一个博主给他的诽谤注入幽默感时,这总是很好的!非常简单,就像我要求的那样!我不指望流量会很大,但我还是会担心挂线。所需的延迟是n到m分钟之间的随机值,其中n>1,m<10,因此可能仍然存在问题。谢谢你!非常简单,就像我要求的那样!我不指望流量会很大,但我还是会担心挂线。所需的延迟是n到m分钟之间的随机值,其中n>1,m<10,因此可能仍然存在问题。谢谢你!您完全正确,但在本例中,请求和响应是客户端的SMS消息