문제

매우 긴 루프가 포함 된 방법으로 테스트 서비스를 만들었습니다. 타임 아웃 트랜잭션이 발생하면 메소드 실행이 플러시되기를 바랐지만 그렇지 않습니다. 클라이언트는 타임 아웃을 얻지 만 처리는 서버에서 계속됩니다.

그것을 막을 방법이 있습니까? 메소드 코드를 변경하지 않고?

예는 다음과 같습니다. 예에서는 큐 바인딩을 사용하여 메소드 queurequest를 호출하고 10 초 후에 트랜잭션이 중단됩니다. 이 시점에서 재 시도가 발생하여 동일한 문제가 발생합니다. 몇 번의 재개 후 서버는 100% CPU 작업을 수행하고 있습니다. 메시지가 독과 떨어졌더라도 여러 스레드 / 인스턴스에서 루프를 실행하려고합니다.


  // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in App.config.
   [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall, 
      TransactionTimeout="00:00:10",
      ReleaseServiceInstanceOnTransactionComplete=true)]
   [ErrorHandlingBehaviorAttribute]
   public class Service1 : IQueueService
   {
      public Service1()
      {
         Trace.WriteLine("Creating an instance on thread " + Thread.CurrentThread.ManagedThreadId.ToString());
      }

      ~Service1()
      {
         Trace.WriteLine("Destroying an instance on thread " + Thread.CurrentThread.ManagedThreadId.ToString());
      }


      [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
      public void QueueRequest(string message)
      {
         int id = Thread.CurrentThread.ManagedThreadId;
         Trace.WriteLine("Got Message on thread " + id.ToString());
         for (int i = 0; i < 1000000; i++)
         {
            Trace.WriteLine("Processing " + i.ToString() + " Thread ID " + id.ToString());
            Thread.Sleep(1000);        
         }
      }
   }
도움이 되었습니까?

해결책

기존 코드를 수정하지 않고는 이것이 가능하다고 생각하지 않습니다.

구경하다 여기 그리고 여기. 요청을 서비스하는 스레드는 WCF 부분에서 완전히 분리되어 클라이언트에게 결과를 전달합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top