【问题标题】:Interlocked.Increment in Dynamics Crm Plugin?Dynamics Crm 插件中的 Interlocked.Increment?
【发布时间】:2020-04-20 18:12:33
【问题描述】:

我想为动态 crm 插件实现一个内部计数器。但我不确定这对于多线程等是否是个好主意。

应该是这样的:

sealed class Counter
{
    private int current = 0;

    public int NextValue()
    {
        return Interlocked.Increment(ref this.current);
    }

    public void Reset()
    {
        this.current = 0;
    }
}

这可能是 Dynamics 插件中的问题?

感谢您对此的看法。

【问题讨论】:

  • 您应该使用 Interlocked.Exchange 进行重置。假设您只有一个 Dynamics 实例,这将起作用。一旦它在多个实例(多个服务器、负载平衡器等)上运行,那么它将无法工作,您将需要另一种方法。我建议使用可以进行原子增量的数据库,因为它实现起来相当简单。

标签: c# multithreading plugins dynamics-crm counter


【解决方案1】:

不清楚这个计数器的目的是什么。是一些业务逻辑还是只是为了统计?

如果您需要计数器进行实体编号,则可以使用 OOB 功能https://docs.microsoft.com/en-us/dynamics365/customerengagement/on-premises/developer/create-auto-number-attributes

D365 具有分布式部署。相同的插件可以在 FE、Async 或 Sandbox 应用程序域上运行,并且通常它们每个都有多个实例。因此,如果您真的想编写自己的分布式计数器,则必须使其适用于任意数量的不同应用程序域。多线程在这里无济于事。所有实例都必须依赖单一的事实来源。这必须是一些外部服务或组织数据库。

一些开发者已经研究过这个问题并写了代码sn-ps的文章:

附:市场上还有用于自动编号\计数器的商业解决方案。

【讨论】:

  • 非常感谢您的反馈,非常感谢!这将用于特定的业务逻辑。我决定避免这种柜台。我使用 GUID 处理整个事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多