Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多线程、HttpContext、长时间运行任务?_C#_Asp.net_Multithreading_Httpcontext - Fatal编程技术网

C# 多线程、HttpContext、长时间运行任务?

C# 多线程、HttpContext、长时间运行任务?,c#,asp.net,multithreading,httpcontext,C#,Asp.net,Multithreading,Httpcontext,我最近开始使用threadsThread.Start()和长时间运行的任务,并注意到几个与请求相关的问题。 编辑 您建议在处理作业时向用户提供反馈,有效利用线程池并尽可能利用HttpContext吗?HttpContext.HttpContext对象的当前属性是静态的。它可以在不同的线程中使用,也可以在App_代码的程序集中使用。但是,它返回当前请求的HttpContext对象 HttpContext的所有静态属性都是线程安全的。HttpContext的所有实例属性都不是线程安全的。在ASP.N

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

编辑


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

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


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

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

请编辑您的问题,以提供有关线程操作的更多详细信息。

有关访问数据:

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

对于访问行为:

如何在ASP.NET中使用线程?工作的两种方法是实现和注册IAsyncHttpHandler,或者从某个ASP.NET页面调用Page.AddOnPreRenderCompleteAsync()

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

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


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

我很困惑,为什么您认为HttpContext。当前不是线程安全的?它主要是只读的,我相信它是线程安全的,但将HttpContext的引用传递给其他线程是危险的,我最终会死的。在我的程序集中使用HttpContext是危险的,而且如果我决定在没有HttpContext的情况下在另一个线程中使用这些程序集,它总是空的。HttpContext.Current的结果取决于你在哪个线程中,因此你的建议是不正确的。请注意,我已经提到,“但是,它返回当前请求的HttpContext对象。”因此,如果您不在请求上下文(边界外)HttpContext.Current显然将返回null,无论您在哪个线程中。谢谢。你犯了一个错误。长时间运行的任务不应作为web应用程序的一部分执行。它们应该被发送到另一个服务来执行。ASP.NET基础结构不是用来处理长时间运行的任务的。您建议如何在处理作业时向用户提供反馈、有效利用线程池以及尽可能利用HttpContext?您不能向用户提供反馈。用户是浏览器。浏览器可以使用AJAX查询操作的状态。您不能使用
HttpContext
来执行此操作。好的,让我们在处理作业时说一句“请稍候…”。异步。页面将阻止渲染否!?不你从哪里得到这些想法?“请稍候”只是让div可见。它甚至可以包含一个很酷的动画gif,用来愚弄用户,使其认为正在发生什么事情。