首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在调用QueueUserWorkItem时在ASP.Net中保留执行线程的上下文?

如何在调用QueueUserWorkItem时在ASP.Net中保留执行线程的上下文?
EN

Stack Overflow用户
提问于 2011-11-17 17:52:53
回答 2查看 1K关注 0票数 3

我们有一个ASP.NET应用程序,它将一些长期运行的操作(例如,生成报告)排队到使用System.Threading.ThreadPool.QueueUserWorkItemThreadPool中。

对于这种方法,我们有两个问题:

  1. 我们使用特定的域服务帐户运行ASP.Net应用程序池,以便它能够访问远程资源,包括文件和数据库。当在ThreadPool中开始执行时,线程的用户标识被设置为Network,这不允许我们访问远程资源.

  1. :web应用程序可以被不同国家的用户同时访问,我们提供给每个用户的数据格式是基于他们的文化设置(使用web.config中的标准全球化设置)。当队列线程启动时,它也丢失了此信息,并恢复到操作系统的默认区域性。

现在,我们可能可以通过捕获状态对象中的当前用户标识和区域性并将其传递给后台工作人员,然后模拟用户并在线程上设置区域性来解决这些问题,但这似乎是解决此问题的一种“不干净”的方法。

有更好的办法吗?

其他信息:

以下是来自web.config的全球化设置

代码语言:javascript
复制
<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="auto" enableClientBasedCulture="true" uiCulture="auto"></globalization>

在处理请求时,ASP.NET会自动将当前线程的CultureUICulture设置为用户请求的区域性( Accept-Language标头中的浏览器将自动传递该区域性)。

可以通过将以下代码添加到代码后面的任何事件(即按钮单击、页面加载等)来复制此行为:

代码语言:javascript
复制
' Called from just about anywhere
ThreadInitiator()

Private Sub ThreadInitator()
   ' Observe the culture and windowsidentity here; they will be correct
   System.Threading.ThreadPool.QueueUserWorkItem(AddressOf Testing, new Object)
End Sub

Private Sub Testing(state As Object)
   ' Observe the culture and windowsidentity here; they will not be what we need them to be
End Sub
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-17 18:23:08

此方法签名:

代码语言:javascript
复制
public static bool QueueUserWorkItem(
    WaitCallback callBack,
    Object state
)

接受状态对象。这可以是一个类的实例,该类保存了用户的区域性以及其他需要持久化的项。此信息被传播回回调方法,在该方法中,可以将其转换回类的实例。

票数 1
EN

Stack Overflow用户

发布于 2011-11-17 18:34:40

您应该做的第一件事是考虑不要从ASP.NET中长时间运行进程,实际上,您应该尝试将任何长时间运行的进程卸载到它所属的服务中。Windows服务、WCF等。

代码语言:javascript
复制
System.Threading.ThreadPool.QueueUserWorkItem(AddressOf Testing, New Object())

这可能是与文化相关的信息的问题。您必须将标识传递给回调方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8171910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档