2009-10-29 50 views
3

我有一个req在哪里必须创建一个工作线程并在整个应用程序生命周期内保持活动状态以执行一些背景任务 。那么有什么办法可以在我的应用程序需要时将任务堆叠到此工作线程中。创建一个工作线程,并保持它在整个我的应用程序生命周期中执行以执行一些背景任务

+0

你使用什么语言或环境? 这听起来像你只需要有一个工作队列,工作队列可以从中提取作业,但如果发布特定信息,你可能会得到更具体的帮助。 – Alex 2009-10-29 06:30:44

+0

我必须在asp.net web应用程序中执行此操作。比如创建工作者线程并让它监听事件,以及何时从主要事件中触发事件都必须执行该任务。 – Questionevrything 2009-10-29 06:34:51

回答

7

更新:即使您已在评论中指出您必须在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)或_beginthreadexCreateThread API(C++)创建自己的线程。在这种情况下,您将必须为前台线程实现一个队列来安排任务,并且您将在后台线程上有一个循环来选择新任务并执行它们。当然,你将不得不使用一些同步原语,如CRITICAL_SECTION(C++)或lock statement(C#/ .Net)来同步来自两个线程的对该队列的访问。

对于Linux或OS X,您可以查看POSIX threads。我没有做很多* nix风格的编程,所以可能有更好的选择。如果您针对的是这些平台之一,请将该信息添加到您的问题中,我相信很快就会有有用的答案。

+0

中用一个例子进行详细的阐述,我必须在asp.net网络应用中做到这一点。比如创建工作者线程并让它监听事件,以及何时从主要事件中触发事件都必须执行该任务 – Questionevrything 2009-10-29 06:51:10

0

创建一个线程通常是通过调用一个特殊的原语(Win32中的CreateThread())并传递一个入口函数来完成的。该函数代码在新产生的线程中调用,并且可以执行任何它想做的事情 - 例如,它可以从预先创建的队列中启动循环和窥视任务。您的主线程可以将任务发布到该队列,以便工作线程处理它们。当队列中没有任务时,工作线程可以简单地阻塞等待新任务发布的同步原语(例如事件)。

+0

你能否在pl.Net – Questionevrything 2009-10-29 06:32:01

相关问题