C# 如何保持执行线程';在ASP.Net中调用QueueUserWorkItem期间的上下文?

C# 如何保持执行线程';在ASP.Net中调用QueueUserWorkItem期间的上下文?,c#,asp.net,.net,vb.net,threadpool,C#,Asp.net,.net,Vb.net,Threadpool,我们有一个ASP.NET应用程序,它使用System.Threading.ThreadPool.QueueUserWorkItem将一些长期运行的操作(例如,生成报告)排入ThreadPool 这种方法有两个问题: 我们使用特定的域服务帐户运行ASP.Net应用程序池,以便它可以访问远程资源,包括文件和数据库。当在线程池中开始执行时,线程的用户标识被设置为网络服务,这不允许我们访问远程资源 不同国家的用户可以同时访问web应用程序,我们提供给每个用户的数据格式基于他们的区域性设置(使用web.

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

这种方法有两个问题:

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

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

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

    有更好的办法吗

    其他信息: 以下是
    web.config
    中的全球化设置:

    <globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="auto" enableClientBasedCulture="true" uiCulture="auto"></globalization>
    
    此方法签名:

    public static bool QueueUserWorkItem(
        WaitCallback callBack,
        Object state
    )
    

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

    您应该首先考虑的是从ASP.NET没有长时间运行的过程。事实上,您应该尝试将任何长时间运行的进程卸载到它所属的服务。Windows服务、WCF等

    System.Threading.ThreadPool.QueueUserWorkItem(测试地址,新对象())
    

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

    也许您可以发布一些关于如何进行区域性设置的代码?@Bryan Crosby:刚刚更新了关于区域性设置的详细信息。此外,可能还有一段关于您对线程池的调用的代码?这有帮助吗@布莱恩·克罗斯比:好的,增加了复制所需的最低限度的代码。