我有一个req在哪里必须创建一个工作线程并在整个应用程序生命周期内保持活动状态以执行一些背景任务 。那么有什么办法可以在我的应用程序需要时将任务堆叠到此工作线程中。创建一个工作线程,并保持它在整个我的应用程序生命周期中执行以执行一些背景任务
回答
更新:即使您已在评论中指出您必须在Asp.Net中执行此操作,但由于它具有一些有用的链接,因此我将在下面留下原始内容。
由于Asp.Net使用线程池来调度传入的请求,因此在线程池上运行后台任务将占用一个线程,并会影响Asp.Net的性能。因此,您将不得不使用Thread
类。
要实现您的方案,您可以创建一个新的Thread
实例,将其IsBackground
属性设置为true并启动它。一旦启动,线程将等待AutoResetEvent
(使用WaitOne
方法)由传入请求(使用Set
met6hod)设置,这将向后台线程发送信号,表明其任务应该被处理。任务完成后,后台线程将再次等待事件。
这是最简单的实现,它不允许在请求和后台线程之间传递参数,并且不允许同时排队多个任务。如果您需要对参数或队列的支持,则必须保持对线程对象的引用,以防进入的请求访问它。
如果IIS决定回收Asp.Net工作进程,您还必须考虑后台线程可能在任何时间点被终止。此外,在后台线程中引发异常将导致IIS回收Asp.Net工作进程。
围绕后台线程的身份还有一些考虑因素。特别是,后台线程不能轻易地在当前的传入请求上模拟用户的身份。这是可能的,但每次通过请求安排新任务时,都需要您传递用户身份。
,如果你告诉我们什么语言,什么平台,你在编写代码时如果碰巧是Windows平台这将是有益的。
,有一个线程池,你可以“借用”从你的任务线程。您可以使用QueueUserWorkItem
API(C++)或ThreadPool.QueueUserWorkItem
(C#/ .Net)在线程池上安排任务。请注意,如果您的任务将运行较长时间,则有一些implications。
您也可以使用Thread
类(C#/ .Net)或_beginthreadex
或CreateThread
API(C++)创建自己的线程。在这种情况下,您将必须为前台线程实现一个队列来安排任务,并且您将在后台线程上有一个循环来选择新任务并执行它们。当然,你将不得不使用一些同步原语,如CRITICAL_SECTION
(C++)或lock statement
(C#/ .Net)来同步来自两个线程的对该队列的访问。
对于Linux或OS X,您可以查看POSIX threads
。我没有做很多* nix风格的编程,所以可能有更好的选择。如果您针对的是这些平台之一,请将该信息添加到您的问题中,我相信很快就会有有用的答案。
中用一个例子进行详细的阐述,我必须在asp.net网络应用中做到这一点。比如创建工作者线程并让它监听事件,以及何时从主要事件中触发事件都必须执行该任务 – Questionevrything 2009-10-29 06:51:10
创建一个线程通常是通过调用一个特殊的原语(Win32中的CreateThread()
)并传递一个入口函数来完成的。该函数代码在新产生的线程中调用,并且可以执行任何它想做的事情 - 例如,它可以从预先创建的队列中启动循环和窥视任务。您的主线程可以将任务发布到该队列,以便工作线程处理它们。当队列中没有任务时,工作线程可以简单地阻塞等待新任务发布的同步原语(例如事件)。
你能否在pl.Net – Questionevrything 2009-10-29 06:32:01
- 1. iPhone:创建另一个线程并执行一些进程
- 2. 如何在自己的线程创建一个表单,并保持它在整个应用程序生命周期
- 3. 在整个应用程序生命周期中保持相同的SPWeb&SPSite?
- 4. 在多线程环境中并行执行每个子任务
- 5. 构建一个可以执行npm任务的web应用程序
- 6. 工作在一个月内每两周在星期一执行
- 7. Python多线程:产生多个线程,只执行最后一个执行
- 8. 执行一个应用程序,并等待它加载
- 9. 寻找一个应用程序生命周期管理工具
- 10. 在Java应用程序中强制定期执行周期性任务
- 11. 如何在另一个线程中执行Ant任务
- 12. 在java中创建一个* .exe应用程序,执行它需要安装java?
- 13. 创建一个只执行URL转发的Beanstalk应用程序
- 14. 我写了一个Java应用程序,它执行一些CRUD工作,但它不会退出,为什么?
- 15. Java线程任务的并发执行
- 16. rxjava2 - 在一个线程池执行任务,订阅在单个线程
- 17. 在多线程程序中执行另一个程序
- 18. 让一个线程运行来执行任务
- 19. 如何在iPhone应用程序的整个生命周期中保持一致的TabBar
- 20. 执行一个JFrame程序
- 21. 在整个应用程序生命周期中只调用一次方法
- 22. 使用一个线程多次执行特定任务C#
- 23. 构建应用程序以定期在服务器上执行任务
- 24. Android线程 - 在执行所有其他线程之前执行一个线程
- 25. 如何让一个石英工作创建另一个工作来执行它?
- 26. 使Spring任务与任务执行器线程一起运行
- 27. 设计多线程程序通常会更好吗每个线程执行一系列任务还是执行多个任务的线程组?
- 28. 在Spring中实例化新线程以定期执行任务
- 29. 如何创建一个新的线程来执行一个动作<T>
- 30. 如何创建多个线程池(即多个执行程序,每个线程池都有一个线程)
你使用什么语言或环境? 这听起来像你只需要有一个工作队列,工作队列可以从中提取作业,但如果发布特定信息,你可能会得到更具体的帮助。 – Alex 2009-10-29 06:30:44
我必须在asp.net web应用程序中执行此操作。比如创建工作者线程并让它监听事件,以及何时从主要事件中触发事件都必须执行该任务。 – Questionevrything 2009-10-29 06:34:51