コード例 #1
0
        private void HandleDbUpdateConcurrencyExceptionReload(object[] paras,
                                                              BuildDbUpdateConcurrencyExceptionFormatStringEventHandler stringHandler1, DbUpdateConcurrencyException db)
        {
            //先记录Debug日志
            string temp = stringHandler1.Invoke(paras, db);

            LogHelper.Debug(temp);
            System.Diagnostics.Debug.WriteLine(temp);

            //发现并发异常,先通过异常对象抓到哪个对象的当前值与数据库不一致
            if (db != null && db.Entries != null && db.Entries.Count() > 0)
            {//对所有不一致的对象,都把他们的“原始值”置为数据库的值
                var entries = db.Entries.ToArray();
                foreach (var entry in entries)
                {
                    var dbvalues      = entry.GetDatabaseValues();
                    var originValues  = entry.OriginalValues;
                    var currentValues = entry.CurrentValues;
                    entry.OriginalValues.SetValues(entry.GetDatabaseValues());
                    entry.Reload();//最后重新加载对象,变成unchanged状态
                }
            }
        }
コード例 #2
0
        internal IdentityResult HandleAndAction(IPrivilegeAsyncImpl asyncImpl, object[] paras)
        {
            CoreActionEventHandler coreAction = asyncImpl.CoreAction;
            BuildDbUpdateConcurrencyExceptionFormatStringEventHandler stringHandler1
                = asyncImpl.DbUpdateConcurrencyExceptionFormatStringBuilder;
            BuildErrorFormatStringEventHandler stringHandler2 = asyncImpl.ErrorFormatStringBuilder;
            IdentityResult taskResult = null;

            int counter = 5;

            //通过配置,设定一个尝试的初始值,暂时写死5
            while (taskResult == null && counter > 0)
            {
                try
                {
                    IdentityResult identResult = coreAction.Invoke(paras);

                    //Task<IdentityResult> tresult = coreAction.Invoke(paras);
                    //tresult.Wait();
                    var result = identResult;// tresult.Result;

                    if (result != null && result.Succeeded)
                    {
                        taskResult = IdentityResult.Success;
                        //Task<IdentityResult>.Run(
                        //() =>
                        //{//保证返回非空的Task结果对象
                        //    return IdentityResult.Success;
                        //}
                        //);
                        ////如果到这里都没有报错,说明已经添加成功无异常,可以直接返回
                        break;
                    }
                }
                catch (DbUpdateConcurrencyException db)
                {
                    HandleDbUpdateConcurrencyExceptionReload(paras, stringHandler1, db);
                }
                catch (AggregateException taskException)
                {
                    LogHelper.Error("ApplicationUserManager.HandleAndAction Exception: ", taskException);
                    if (taskException.InnerException != null)
                    {
                        LogHelper.Error("ApplicationUserManager.HandleAndAction InnerException: ", taskException.InnerException);

                        if (taskException.InnerException is DbUpdateConcurrencyException)
                        {
                            HandleDbUpdateConcurrencyExceptionReload(paras, stringHandler1,
                                                                     taskException.InnerException as DbUpdateConcurrencyException);
                        }
                    }
                }
                //在这里出来就是要么没有异常,要么异常已经被处理,无论如何先减Counter避免死循环
                counter--;//如果Counter未为0,则继续尝试直到不爆这个异常
            }

            if (taskResult == null)
            {
                return(HandleNonCatchedExceptionReturn(paras, stringHandler2));
            }

            return(taskResult);
        }