2012-03-21 3 views
5

NServiceBus 메시지에있는 로깅 정보를 데이터베이스에 저장하는 클래스가 있습니다 (Handle 메서드).조건부로 별도의 스레드에서 클래스의 메서드를 실행하십시오.

대부분의 경우 로깅은 주 프로세스와 별도의 스레드 (트랜잭션)에서 수행 할 수 있습니다. 그러나 모두 동일한 배경 스레드에서 수행되어야합니다 (즉, 순서대로 완료되어야 함을 의미하고 주 프로세스와 동기화되지 않음).

그러나 NServiceBus에서 실제 데이터에 대한 외부 키 입력을 시작하면 동일한 스레드에 있어야합니다. 또한 조건부 다른 스레드로 실행을 이동하는 조건 내 트랜잭션을 사용하는 방법이 있는지

public class MyExample 
{ 

    public void LogSomeStuff(Stuff stuff) 
    { 
     using (MoveOutsideTransaction()) 
     { 
     // Do Method Stuff here 
     dataAccess.SaveChanges(); 
     } 
    } 


    public void LogSomeOtherStuff(Stuff stuff) 
    { 
     using (MoveOutsideTransaction()) 
     { 
     // Do Other Method Stuff here 
     dataAccess.SaveChanges(); 
     } 
    } 

    private IDisposable MoveOutsideTransaction() 
    { 
     if (loggingOutsideTransaction) 
      return new TransactionScope(TransactionScopeOption.Suppress); 

     return null; 
    } 
} 

내가 궁금 : 여기

몇 가지 예제 코드입니다. (단, 만 트랜잭션을 억제합니다.)

답변

2

도 조건부로 다른 스레드로 실행을 이동 조건부 내 트랜잭션을 사용하는 방법이 있는지 궁금하고있다.

메서드 실행을 다른 스레드로 옮길 수는 없습니다. 스레드는 일반적으로 그런 식으로 작동하지 않습니다. 그러나 마샬링 작업에 참여할 수있는 전용 스레드를 설치하면됩니다. 마샬링 작업은 다른 스레드에 대한 실행 전송을 시뮬레이션합니다. 이 전용 스레드가이 마샬링 작업을 수락하도록 특별히 코딩되어야한다는 요지를 집에서 파악하는 것이 중요합니다.

다음은 작동 방식입니다.

public class DedicatedThread 
{ 
    private BlockingCollection<Action> actions = new BlockingCollection<Action>(); 

    public DedicatedThread() 
    { 
    var thread = new Thread(
    () => 
     { 
     while (true) 
     { 
      Action action = actions.Take(); 
      action(); 
     } 
     }); 
    } 

    public void SubmitAction(Action action) 
    { 
    actions.Add(action); 
    } 
} 

그리고 이와 같이 사용할 수 있습니다.

if (loggingOutsideTransaction) 
{ 
    // Execute asynchronously on a dedicated thread. 
    dedicatedThread.SubmitAction(yourActionDelegate); 
} 
else 
{ 
    // Execute synchronously. 
    yourActionDelegate(); 
} 
+0

이 방법은 훌륭하게 보이지만 많은 방법에는 여러 가지 매개 변수가 있습니다. 대부분은'string'과'int's입니다 만, 나는 그것들을 전달할 필요가 있습니다.이 설정으로 할 수있는 방법이 있습니까? (이것은 메소드를 호출하는 것처럼 보이지만 호출 할 때마다 매개 변수를 허용하지 않습니다.) – Vaccano

+2

@Vaccano : 대신'Action '을 사용할 수 있습니다. 또는 람다 표현식을 통해'Action' 델리게이트를 만들 때 변수에 대한 클로저를 할 수 있습니다. –

관련 문제