-1

이러한 오류가 발생하기 시작했습니다. 이전 서버에서 완벽하게 작동했습니다.백그라운드 워커에서 'unitOfWork 매개 변수가 null 일 수 없습니다.'

배경 작업자 내부에서 작동합니다. 그것은 전에 일했다. 이제는 그렇지 않습니다. Contact 개체가 null이 아닙니다. unitOfWork 매개 변수를 Update 방법에 추가하라고 묻는 것 같습니다. 이 점을 이해하도록 도와주세요.

ERROR 2017-12-26 12:02:34,768 [14 ] orkers.ContactValidationBackgroundWorker - System.ArgumentNullException: Value cannot be null. 
Parameter name: unitOfWork 
    at Abp.EntityFrameworkCore.Uow.UnitOfWorkExtensions.GetDbContext[TDbContext](IActiveUnitOfWork unitOfWork, Nullable`1 multiTenancySide) 
    at Abp.EntityFrameworkCore.Repositories.EfCoreRepositoryBase`3.Update(TEntity entity) 
    at Castle.Proxies.Invocations.IRepository`2_Update_8.InvokeMethodOnTarget() 
    at Castle.DynamicProxy.AbstractInvocation.Proceed() 
    at Abp.Domain.Uow.UnitOfWorkInterceptor.PerformSyncUow(IInvocation invocation, UnitOfWorkOptions options) 
    at Castle.DynamicProxy.AbstractInvocation.Proceed() 
    at Castle.Proxies.IRepository`1Proxy_3.Update(Contact entity) 
    at EMS.BackgroundWorkers.ContactValidationBackgroundWorker.<Validate>d__21.MoveNext() in /Users/grinay/Projects/EMSBackend/src/EMS.Application/BackgroundWorkers/ContactValidationBackgroundWorker.cs:line 329 

갱신 1은

ERROR 2017-12-27 05:31:34,500 [9 ] orkers.ContactValidationBackgroundWorker - System.ArgumentNullException: Value cannot be null. 
Parameter name: unitOfWork 
    at Abp.EntityFrameworkCore.Uow.UnitOfWorkExtensions.GetDbContext[TDbContext](IActiveUnitOfWork unitOfWork, Nullable`1 multiTenancySide) 
    at Abp.EntityFrameworkCore.Repositories.EfCoreRepositoryBase`3.UpdateAsync(TEntity entity) 
    at Castle.Proxies.Invocations.IRepository`2_UpdateAsync_8.InvokeMethodOnTarget() 
    at Castle.DynamicProxy.AbstractInvocation.Proceed() 
    at Abp.Domain.Uow.UnitOfWorkInterceptor.PerformAsyncUow(IInvocation invocation, UnitOfWorkOptions options) 
    at Castle.DynamicProxy.AbstractInvocation.Proceed() 
    at Castle.Proxies.IRepository`1Proxy_3.UpdateAsync(Contact entity) 
    at EMS.BackgroundWorkers.ContactValidationBackgroundWorker.<>c__DisplayClass23_0.<<Validate>b__0>d.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Nito.AsyncEx.Synchronous.TaskExtensions.WaitAndUnwrapException(Task task) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot) 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Nito.AsyncEx.Synchronous.TaskExtensions.WaitAndUnwrapException(Task task) 
    at Nito.AsyncEx.AsyncContext.Run(Func`1 action) 
    at EMS.BackgroundWorkers.ContactValidationBackgroundWorker.Validate(ValidationObject validationObject) 
+0

준비 :

다음 5 개 라인을 변경합니다. 그래서 문제는 서버 중 하나에서만 발생합니다. CentOS 6. 우분투 및 Mac을 로컬에서 완벽하게 작동합니다. 하지만 centos에서는 작동하지 않습니다. – grinay

+0

질문을 편집하여 메서드 서명을 표시하십시오. – aaron

답변

0

당신은 배경 작업자 같은 unitOfWorkasync 방법을 사용할 수 없습니다.

public void Worker(object sender, DoWorkEventArgs e) 
{ 
    // ... 

    workerBlock = new ActionBlock<ValidationObject>(
     (arg) => Validate(arg), // This line #1 
     new ExecutionDataflowBlockOptions 
     { 
      MaxDegreeOfParallelism = 5 
     }); 

    // ... 
} 

private void Validate(ValidationObject validationObject) // This line #2 
{ 
    try 
    { 
     using (var contactUnitOfWork = _unitOfWorkManager2.Begin(TransactionScopeOption.RequiresNew)) 
     { 
      Contact contact = validationObject.Contact; 
      contact.IsChecked = true; 

      AsyncHelper.RunSync(async() => // This line #3 
      {        // This line #4 
       await _contactRepository.UpdateAsync(contact); 
       await contactUnitOfWork.CompleteAsync(); 
      });        // This line #5 
     } 
    } catch (Exception ex) { 
     Logger.Error(ex.ToString()); 
     throw; 
    } 
} 
+0

코드를 변경하면 권장 사항과 함께 다른 코드가 생성됩니다. UPDATE1보세요. 나는이 오류가 Centos 6이있는 서버 하나만 발생한다고 다시 말합니다. 그것은 Mac 및 우분투 서버에서 완벽하게 작동합니다. – grinay

+0

'Async' 버전을 전혀 사용하지 않으면 어떨까요? – aaron

+0

나는 오직 동기화 방법만을 사용해 보았습니다. 그리고 첫 번째 오류도 얻으십시오. 나는 무슨 일이 벌어지고 있는지 모르지만 내 코드 밖에서는 문제처럼 보입니다. 그것은 Mac에서 로컬로 작동하고 오류없이 디버깅 모드에서도 작동합니다. 그것은 우분투 서버에서 작동합니다. 하지만 여기에 오류가 발생합니다. – grinay