我们有一个ASP.NET应用程序,它将一些长期运行的操作(例如,生成报告)排队到使用System.Threading.ThreadPool.QueueUserWorkItem的ThreadPool中。
对于这种方法,我们有两个问题:
现在,我们可能可以通过捕获状态对象中的当前用户标识和区域性并将其传递给后台工作人员,然后模拟用户并在线程上设置区域性来解决这些问题,但这似乎是解决此问题的一种“不干净”的方法。
有更好的办法吗?
其他信息:
以下是来自web.config的全球化设置
<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="auto" enableClientBasedCulture="true" uiCulture="auto"></globalization>在处理请求时,ASP.NET会自动将当前线程的Culture和UICulture设置为用户请求的区域性( Accept-Language标头中的浏览器将自动传递该区域性)。
可以通过将以下代码添加到代码后面的任何事件(即按钮单击、页面加载等)来复制此行为:
' 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发布于 2011-11-17 18:23:08
此方法签名:
public static bool QueueUserWorkItem(
WaitCallback callBack,
Object state
)接受状态对象。这可以是一个类的实例,该类保存了用户的区域性以及其他需要持久化的项。此信息被传播回回调方法,在该方法中,可以将其转换回类的实例。
发布于 2011-11-17 18:34:40
您应该做的第一件事是考虑不要从ASP.NET中长时间运行进程,实际上,您应该尝试将任何长时间运行的进程卸载到它所属的服务中。Windows服务、WCF等。
System.Threading.ThreadPool.QueueUserWorkItem(AddressOf Testing, New Object())这可能是与文化相关的信息的问题。您必须将标识传递给回调方法。
https://stackoverflow.com/questions/8171910
复制相似问题