0

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

编辑

您建议在处理作业时向用户提供反馈,有效利用线程池并尽可能使用 HttpContext?

4

3 回答 3

3

您很可能在 ASP.NET 应用程序中使用线程时犯了一个错误。您是在使用异步页面,还是在使用 new Thread().Start?后者是一个错误,当请求完成但线程仍在运行时,可能会让您陷入 HttpContext 的一些问题。

请编辑您的问题,以提供有关您正在使用线程做什么的更多详细信息。

于 2009-07-24T19:52:13.540 回答
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,您从线程编写的新代码可以传入本答案前面描述的上下文之一。

于 2009-07-26T01:22:05.263 回答
-1

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

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

于 2009-07-24T18:14:19.493 回答