Dynamics crm 2011 OrganizationServiceProxy和生成的xrm服务上下文的线程安全

Dynamics crm 2011 OrganizationServiceProxy和生成的xrm服务上下文的线程安全,dynamics-crm-2011,Dynamics Crm 2011,这是一个最佳实践问题。 根据此和MSDN,线程不是线程安全的 如果您有一个多线程客户端应用程序,您正在其中创建 (基于每个线程),其构造函数接受 实例,然后传入 (即在“进程级别”分配一次静态实例),这是否会导致线程问题和/或如果实例出现故障,是否会影响线程在其自身的“本地”实例上尝试执行的操作 我相信它会的,并且需要在“每个线程”的基础上创建一个实例,多线程应用程序中的每个实例都需要自己相应的实例 我发布这篇文章是为了确认以上内容 文章还指出, 服务代理类使用以下类方法执行元数据下载和用户身份

这是一个最佳实践问题。 根据此和MSDN,线程不是线程安全的

如果您有一个多线程客户端应用程序,您正在其中创建 (基于每个线程),其构造函数接受 实例,然后传入 (即在“进程级别”分配一次静态实例),这是否会导致线程问题和/或如果实例出现故障,是否会影响线程在其自身的“本地”实例上尝试执行的操作

我相信它会的,并且需要在“每个线程”的基础上创建一个实例,多线程应用程序中的每个实例都需要自己相应的实例

我发布这篇文章是为了确认以上内容

文章还指出,

服务代理类使用以下类方法执行元数据下载和用户身份验证

IServiceManagement或ServiceManagement=
ServiceConfigurationFactory.CreateManagement(
新Uri(组织URL))
AuthenticationCredentials authCredentials=orgServiceManagement.Authentication(凭据)
通过缓存服务管理和经过身份验证的凭据对象,应用程序可以更高效地在每个应用程序会话中多次构造服务代理对象

如果我尝试在Active directory身份验证模式下手动执行上述API调用,
authCredentials.SecurityTokenResponse
作为

是否有一种方法可以只对AD模式执行一次身份验证,并通过以下构造函数将经过身份验证的传递给新创建的

OrganizationServiceProxy(IServiceConfiguration,SecurityTokenResponse)

这样,在构建每个线程的实例时,您就不必在“每个线程”的基础上进行身份验证和元数据下载操作,只需进行一次操作?

是的,如果您在单个IOrganization服务上尝试多线程操作,您肯定会遇到问题

我们有两个基本的多线程CRM应用程序:批处理程序和另一个web应用程序。对于批处理程序,我发现最好只有10个不同的线程,并在10个不同的线程之间进行批处理。因此,如果要插入100000条记录,请将它们分成10批10000条,每个线程使用一个组织服务

我们还有一个网站可以进行大量CRM交互,因此没有真正的方法来批处理请求,因此我们创建了一个CRM连接池来重用任何打开的、已经验证的连接


当然,如果你不使用某个系统服务帐户,这根本不起作用。

Daryl:你能详细介绍一下你的连接池吗?我认为,如果将OrganizationServiceProxy对象集中在一起,并且如果多个web请求线程最终与处理不同web请求的另一个线程共享同一个OrganizationServiceProxy对象,您也会在这里遇到线程问题。我创建了一个连接池类,该类实现了I一次性,基本上只有一个公共方法,GetConnection。您传入连接所需的信息,连接池在第一次创建一个连接(我想它最多会创建10个),当该线程完成时,它将退出using语句,连接池类只会将连接标记为空闲。下次线程需要相同类型的连接时,它将从空闲池中为其提供一个连接。@Daryl您能在此处添加连接池类代码吗?@Dot_NET Pro Tootache代码已丢失在history@Daryl我知道这很古老,但是,您是否有任何类似的代码类或链接可以共享,这将非常好。我知道这是一个旧线程,但值得一读有关缓存代理对象和.NET任务并行库的内容。至于使用AD凭据获取SecurityTokenResponse,唯一的方法是使用ADFS,它在AD身份验证服务上提供所需的标记化层。