Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架并行任务与WCF_C#_Wcf_Entity Framework_Entity Framework 4_Task Parallel Library - Fatal编程技术网

C# 实体框架并行任务与WCF

C# 实体框架并行任务与WCF,c#,wcf,entity-framework,entity-framework-4,task-parallel-library,C#,Wcf,Entity Framework,Entity Framework 4,Task Parallel Library,我需要插入一些数据,通过从UI调用WCF并传递对象列表来完成。然后,服务调用一个较低的业务层,该层依次插入项目(调用其他几个管理器,并通过ObjectContext进行大量调用/插入) 现在我无法理解的问题是: 如果我多次调用该服务并逐个传递项目,那么一切都会正常进行,插入将并行进行,并且在时间方面我会获得一些性能优势 如果我尝试在服务类中调用并行foreach,我会得到一个exeception,因为ObjectContext不是线程安全的,但是我不能每次使用它时都锁定代码,因为它发生的次数太

我需要插入一些数据,通过从UI调用WCF并传递对象列表来完成。然后,服务调用一个较低的业务层,该层依次插入项目(调用其他几个管理器,并通过ObjectContext进行大量调用/插入)

现在我无法理解的问题是:

  • 如果我多次调用该服务并逐个传递项目,那么一切都会正常进行,插入将并行进行,并且在时间方面我会获得一些性能优势

  • 如果我尝试在服务类中调用并行foreach,我会得到一个exeception,因为ObjectContext不是线程安全的,但是我不能每次使用它时都锁定代码,因为它发生的次数太多了

为什么如果我打电话给WCF,它会工作吗?在我的经理课上有没有同样的方法


谢谢

根据您的服务配置,将为每个并行服务调用创建一个新实例。但是在服务中使用并行循环将导致同一ObjectContext被多次使用。因此,基本上,通过WCF调用parallel会创建多个ObjectContext,其中在WCF服务中执行只使用一个ObjectContext(如您所知,这不是线程安全的)。根据插入内容的性质,这可能没问题。您还可以在服务中启动多个ObjectContext


有些是胡乱猜测,因为您实际上可以影响WCF服务的行为,使其不运行多个实例,但从您的行为经验来看,这应该是您可以使用WCF服务而不是在WCF服务内执行并行插入的原因。

这或多或少是我的想法,但在这种情况下,如果我在执行任何类似于调用WCF的操作之前,使用新的ObjectContext启动每个循环,对吗?相反,它不起作用。当涉及到并行处理时,存在许多陷阱,您能否确定在使用WCF服务时实际执行了多少并行任务,而不是在WCF服务内部执行了多少并行任务?考虑下面的,Paralle。对于Rangy刻度到可用处理器的数量,其中WCF服务可能被限制为任意数量。另外,在并行循环中实例化ObjectContext时,您遇到了什么样的异常?我遇到了几个不同的错误,例如“当读卡器关闭时调用read的尝试无效”或“实体xxx多次映射”。它们似乎是错误,不应该存在于不同的上下文中确实如此,但是如果没有代码,我无法确定您是否有某种线程间通信(您使用的EF实体是什么类型的:自跟踪、POCO还是默认的EntityObject?)!这只是一个访问和重新计算每次插入相同记录的操作,我已经锁定了代码的这一部分,现在一切正常!我还有一个问题,您认为这是通过EF在db中执行并行插入的最佳方法吗?