亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在具有 2 個不同 .SVC 文件的多線程環境中調用 WCF 服務。同時調用兩個服務時出錯

在具有 2 個不同 .SVC 文件的多線程環境中調用 WCF 服務。同時調用兩個服務時出錯

C#
慕田峪7331174 2021-07-13 21:21:51
我有一個應用程序,它有兩個特定于兩個不同模塊的 .SVC 文件。在現有的應用程序中,我們在同一個線程中一個接一個地進行調用。我從來沒有問題。作為重構的一部分,我清理了它們從兩個不同的線程調用這些服務(第一個線程調用第一個方法,第二個線程調用第二個方法)。這兩種方法甚至是不同的。有時代碼在執行時沒有任何問題。但有時,我收到以下錯誤消息,說找不到實例。同樣,此錯誤并不總是發生。      Exception:                RMS Conversion failed : System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]: ComponentActivator: could not instantiate Axis.Edc.Service.RMS.RMSConversionService (Fault Detail is equal to An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is:    Castle.MicroKernel.ComponentActivator.ComponentActivatorException: ComponentActivator: could not instantiate RMS.RMSConversionService ----> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ----> System.InvalidOperationException: The context cannot be used while the model is being created. This exception may be thrown if the context is used inside the OnModelCreating method or if the same context instance is accessed by multiple threads concurrently. Note that instance members of DbContext and related classes are not guaranteed to be thread safe.       at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()       at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)       at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()       at System.Data.Entity.Internal.Linq.InternalSet`1.GetEnumerator...).這是對服務的代碼調用:public EnumConversionStatus GenerateRmsImportFiles(int submissionId)        {            lock (new object())            {                using (var client = new RMSConversionService.RMSConversionServiceClient())                {                    var result = client.GenerateRmsImportFiles(submissionId);                    client.Close();                    return result;                }            }        }這里我們有兩個不同的端點用于 2 個不同的 SVC 服務。也在這里我們有鎖。我不確定如何準確解決此錯誤?
查看完整描述

1 回答

?
森林海

TA貢獻2011條經驗 獲得超2個贊

lock (new object())每次使用都會創建一個新對象。這意味著每個線程鎖定不同的對象。這根本不是鎖定。


如果您的兩個服務不使用相同的資源,則不需要鎖定。但是正如我從您的異常中看到的那樣,您在兩個服務之間使用共享資源 - 這是實體框架 DbContext。


我想一個線程正在初始化 DbContext,同時第二個線程正在使用相同的 DbContext。正如您從異常消息中看到的:


創建模型時不能使用上下文。如果在 OnModelCreating 方法中使用上下文,或者多個線程同時訪問相同的上下文實例,則可能會引發此異常。請注意,不保證 DbContext 和相關類的實例成員是線程安全的。


更好的鎖定是:


private object _lock = new object();


    public EnumConversionStatus GenerateRmsImportFiles(int submissionId)

            {

                lock (_lock)

                {

                    using (var client = new RMSConversionService.RMSConversionServiceClient())

                    {

                        var result = client.GenerateRmsImportFiles(submissionId);

                        client.Close();

                        return result;

                    }

                }

            }



    public EnumConversionStatus GenerateAirImportFiles(int submissionId)

            {

                lock (_lock)

                {

                    using (var client = new AIRConversionService.AirConversionServiceClient())

                    {

                        var result = client.GenerateAirImportFiles(submissionId);

                        return result;

                    }

                }

            }


查看完整回答
反對 回復 2021-07-31
  • 1 回答
  • 0 關注
  • 256 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號