내부에 Linq 쿼리가있는 foreach 루프가 있습니다. 내가 Parallel.ForEach에 foreach 문을 변경할 때까지Linq In Parallel.ForEach
모든 위대한 실행 :
// get the task info ---------
Log("Populate task, guf code lists ...........................");
List<SF_CO_ITEM> tasks = (from coi in ctx.SF_CO_ITEM
where coi.CO == co.ID
select coi).ToList();
// foreach (SF_CO_ITEM t in tasks)
// {
Parallel.ForEach(tasks, t =>
{
Log("Executing on t: " + t.ID);
// exception on next line:
List<SF_CO_LINE_ITEM> gufs = (from coli in ctx.SF_CO_LINE_ITEM
where coli.CO_ITEM == t.ID
select coli).ToList();
내가 얻을 예외입니다 :
System.AccessViolationException 읽거나 쓰기 에 시도되지 않은 메시지 =였다 보호 된 메모리. 이것은 종종 다른 메모리가 손상되었음을 나타냅니다. 소스 = Oracle.DataAccess 스택 트레이스 : Oracle.DataAccess.Client.OpsCon.Open (&을 IntPtr opsConCtx, &을 IntPtr opsErrCtx, OpoConValCtx * pOpoConValCtx, OpoConRefCtx & pOpoConRefCtx) Oracle.DataAccess.Client.ConnectionDispenser.Open에서 (OpoConCtx opoConCtx에서 ) System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf (부울 openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection 스트링으로 Exception 문자열 attemptedOperation, 부울 & closeStoreConnectionOnFailure) 에서 Oracle.DataAccess.Client.OracleConnection.Open()에서 에서 System.Data.EntityClient System.Data.Objects.ObjectQuery
1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Collections.Generic.List
1..ctor에서 System.Data.Objects.ObjectQuery1.GetResults(Nullable
1 forMergeOption) 에서 System.Data.Objects.ObjectContext.EnsureConnection()에서 .EntityConnection.Open() (IEnumerable을1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 소스) 에서 ChangeOrder.Program. < C에서> C_ DisplayClass19.b _16 (SF_CHANGE_ORDER_ITEM t) : \ VS_apps \ PMConsole \ PMC 도구 \ ChangeOrderExecution \ Program.cs : System.Threading.Tasks.Parallel에서 선 220 . <> C_ 는 System.Threading.Tasks.Task에서 System.Threading.Tasks.Task.InnerInvokeWithArg (작업 childTask) 에서 System.Threading.Tasks.Task.InnerInvoke()에서2.<ForEachWorker>b__23(Int32 i) at System.Threading.Tasks.Parallel.<>c__DisplayClassf
1.B _c()를 DisplayClass2d . System.Threading.Tasks.Task에서 System.Threading.Tasks.Task.Execute() 에서 System.Threading.Tasks.Task.ExecuteSelfReplicating (작업 루트) 에서 <> C_ DisplayClass7.b _6 (객체 ) .ExecutionContextCallback하여 System.Threading에서 System.Threading.Tasks.Task.ExecuteWithThreadLocal (작업 & currentTaskSlot) 에서 (개체 OBJ) System.Threading.ExecutionContext.Run에서 (의 ExecutionContext의 ExecutionContext, ContextCallback 콜백, 객체 상태, 부울 ignoreSyncCtx) .Tasks.Task.ExecuteEntry (Boolean bPreventDoubleExecution) at System.Threading.Tasks.ThreadPoolTaskScheduler.TryExecuteTaskInline (작업) 6,작업, 부울 taskWasPreviouslyQueued) System.Threading.Tasks.TaskScheduler.TryRunInline (작업 작업, 부울 taskWasPreviouslyQueued, threadStatics 객체) System.Threading.Tasks.Task.InternalRunSynchronously에서 (TaskScheduler 스케줄러) 에서 System.Threading.Tasks에서 .Task.RunSynchronously (TaskScheduler scheduler) at System.Threading.Tasks.Parallel.ForWorker [TLocal (INT32 fromInclusive, INT32 toExclusive, ParallelOptions의 parallelOptions, 액션1 body, Action
2 bodyWithState, Func을4 bodyWithLocal, Func
1 localInit, 액션 목록 ParallelOptions의 parallelOptions, 액션 bodyWithState, 액션3 bodyWithStateAndIndex, Func
4 bodyWithStateAndLocal, Func을5 bodyWithEverything, Func
1 localInit, 액션 소스 parallelOptions의 parallelOptions, 액션 bodyWithState, 액션3 bodyWithStateAndIndex, Func
4 bodyWithStateAndLocal, Func을5 bodyWithEverything, Func
1 localInit,,691 363,210 액션1 localFinally) at System.Threading.Tasks.Parallel.ForEach[TSource](IEnumerable
C에서 ChangeOrder.Program.PerformChangeOrder (SF_CHANGE_ORDER 공동 SF_CLIENT_PROJECT의 CP, SFEntitiesQA CTX)에서 1 개 소스 Action`1 체) : \ VS_apps \ PMConsole \ PMC 도구 \ ChangeOrderExecution \ Program.cs : 라인 216 C : \ VS_apps \ PMConsole \ PMC Tools \ ChangeOrderExecution \ Program.cs의 ChangeOrder.Program.Main (String [] args)에서 at System.AppDomain._nExecuteAssembly (RuntimeAssembly assembly, String [] args) at System.Threading.ThreadHelper.ThreadStart_Context (Object state)에서 을 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 에서 가져 오려면 어셈블리 파일의 System.AppDomain.ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, String [] args) 91,363,210 System.Threading.ExecutionContext.Run에서 (ExecutionContext에의 ExecutionContext는 ContextCallback 콜백, 객체 상태 부울 ignoreSyncCtx) System.Threading.ExecutionContext.Run에서 System.Threading.ThreadHelper에서 을 (ExecutionContext에 ExecutionContext에, ContextCallback 콜백 상태 객체). ThreadStart() InnerException :
나는 단지 정보를 얻고 있기 때문에 잠글 필요가 있을지 모르겠다.
"AsParallel"을 추가하는 것에 대해 생각해 보았습니다.하지만 필자는 PLINQ 지시문을 사용하여 쿼리가 자체적으로 병렬로 실행되도록합니다.
Parallel.ForEach 루프 내에서 Linq 쿼리를 실행하는 사용자의 사례를 찾을 수 없으므로 내가하는 일이 허용되는지조차 알지 못합니다.
'foreach'를'Parallel.ForEach'로 바꾸는 것은 큰 변화입니다. 작업이 실제로 병렬로 실행될 수 있는지 확인해야합니다. –