小编Isk*_*zov的帖子

MSCRM插件.C#如何保证关键块的单一执行?

首先,我在Microsoft Dynamics CRM插件代码中面临着奇怪的问题.

这是我的代码示例:

public class Counter : Plugin
{
    private static object Locker = new object();

    public Counter() : base(typeof(Counter)) 
    { 
        .... 
    }

    public void GenerateNumber(LocalPluginContext localContext)
    {
        IOrganizationService service = localContext.OrganizationService;
        IPluginExecutionContext context = localContext.PluginExecutionContext;

        Entity Target = (Entity)context.InputParameters["Target"];

        var Number=0;
        lock(Locker)
        {
            var CounterEntity = service.GetCounterEntity();

            Number=(int)CounterEntity["number"];
            CounterEntity["number"]=Number+1;

            service.Update(CounterEntity);
        }

        Target["number"]=Number;
        service.Update(Entity);
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,每次创建一些实体时,系统都会创建实例Counter并执行GenerateNumber方法.Counter应该从Counter Entity获取最后一个数字的实例,增加它并将其保存到数据库.但不知何故,这段代码生成了两次相同的数字.

如果计数器在不同的线程中创建,那么lock应该完成他的工作.

为什么会这样,我怎么能解决这个问题呢?我应该用信号量替换锁吗?

c# locking dynamics-crm

1
推荐指数
1
解决办法
3042
查看次数

标签 统计

c# ×1

dynamics-crm ×1

locking ×1