多线程,HttpContext,长时间运行任务?

时间:2009-07-24 17:19:01

标签: c# asp.net multithreading httpcontext

我最近开始使用线程Thread.Start()长时间运行的任务,并注意到几个与请求相关的问题。

修改

您建议在处理作业时向用户提供反馈,如果可能,请高效使用线程池并使用HttpContext?

3 个答案:

答案 0 :(得分:3)

您很可能在ASP.NET应用程序中使用线程时出错。您使用异步页面,还是使用新的Thread()。开始?后者是一个错误,当请求完成时,可以让你解决HttpContext的一些问题,但线程仍在运行。

请编辑您的问题,以提供有关您使用主题执行操作的详细信息。

答案 1 :(得分:0)

访问数据:

对于像Server.Identity.Name这样的数据,我认为事先收集这些信息并将其传递给异步代码是一种很好的方法。它与代码的良好解耦现在只取决于那几个属性。

访问行为:

您如何在ASP.NET中使用线程?有两种方法可以实现和注册IAsyncHttpHandler,或者从一些ASP.NET页面调用Page.AddOnPreRenderCompleteAsync()。

对于IAsyncHttpHandler,您实现的回调是传递给HttpContext的。您应该能够在任何线程中使用该引用的上下文,直到您向ASP.NET指示请求处理已完成。当然,你应该一次只使用一个线程的引用。

对于Page.AddOnPreRenderCompleteAsync,在相同条件下从回调中调用Page.Context应该是安全的。

对于App_Code中使用HttpContext.Current的现有代码,您需要重构它,以便代码将HttpContext作为输入参数。现有代码可以传入HttpContext.Current,您从线程编写的新代码可以传递给本答案前面描述的上下文之一。

答案 2 :(得分:-1)

HttpContext对象的HttpContext.Current属性是静态的。它可以在不同的线程或App_Code的程序集中使用。但是,它返回当前Request的HttpContext对象。

HttpContext的所有静态属性都是线程安全的。并且HttpContext的所有实例属性都不是线程安全的。