在asp.net中异步运行方法

时间:2012-03-20 17:57:43

标签: c# asp.net

我有一个带有按钮的网页,该按钮可以生成一些文件到服务器路径。 (需要5到20分钟的时间)。我想创建一个异步任务,即使在用户关闭浏览器后也会继续执行。用asp.net 4和C#可以做到这一点吗?

6 个答案:

答案 0 :(得分:2)

您无法控制asp.net应用程序中的线程池。您甚至无法保证请求将在它开始的同一个线程上完成。创建线程使用与Web服务器使用的相同的应用程序池,并且您可以用尽所有请求线程,使Web服务器不可用于处理请求。

您应该实现一个承载WCF服务的Windows服务,您可以在Web应用程序中调用该服务。在服务中,您可以启动一个线程来处理长时间运行的进程。在该过程结束时,您可以更新状态标志(例如,从处理完成),用户可以查看该标志以确定文件是否已完成处理。

我建议使用Topshelf来实现您的Windows服务,这会让您头疼不已。

答案 1 :(得分:1)

实际上,建议您不要这样做。相反,建议的方法是创建一个异步执行处理的服务(例如Windows服务)。在Web应用程序中,您可以创建启动流程的方法,以及轮询服务以确定处理是否已完成的另一种方法。

这有很多原因,但其中最大的原因之一是Web服务器的默认和推荐配置允许服务器终止长时间运行的请求。

答案 2 :(得分:0)

或者说我不明白你想做什么,或者你不需要做什么。

发送请求后,无论用户浏览器是否关闭,请求过程都会继续。你不需要做任何事情

无状态WEB应用程序的绝佳性质......

答案 3 :(得分:0)

你必须创建一个执行长时间运行任务的线程

看看下面的内容:

http://kiranpatils.wordpress.com/2010/01/01/performing-a-long-running-task-with-asp-net/

无论如何,只要用户关闭浏览器,您将在服务器上启动它将继续运行(直到您回收应用程序池或重新启动Web服务器)。

答案 4 :(得分:0)

创建新线程/使用线程池是创建失控任务的最简单方法。

请注意,无法确保进程在长时间任务期间保持活动状态 - 因此请准备好处理部分完成和手动重新启动。即由于配置更改,AppPoll会回收。

答案 5 :(得分:0)

最简单的方法是将您的任务放在ThreadPool上。即使在网页完成渲染之后,线程池线程也将保持活动状态。代码如下所示:

/* Beginning Method */
object someData = new object();
ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessAsync), someData);
/* Ending Method */

static void ProcessAsync(Object stateInfo) 
{
    string dataToString = stateInfo.ToString();
}