2011-08-24 5 views
0

이것은 다른 곳에서 논의 될 수 있지만 찾을 수 없습니다. 나는 날짜 범위를 통해 반복하고 계산 및 업데이트 레코드를 데이터베이스에서 실행하는 기능을 가진 .Net Web Service를 보유하고 있습니다. 이 기능에 긴 날짜 범위를 지정하면 완료하는 데 꽤 오랜 시간이 걸릴 수 있습니다. 이 경우,이 기능을 중지 할 방법이 필요합니다.방법 : 웹 서비스 기능 요청 취소

식별 된 스레드에서 웹 서비스 함수 호출을 실행하여 필요한 경우 해당 스레드를 취소 할 수있는 방법이 있습니까? 아니면이 생각을 넘어서거나 생각하고 있습니까? 나는 웹 서비스 기능에 대한 AJAX 호출을 수행하기 위해 jQuery와 함께 C# .Net 웹 페이지를 사용하고있다. 어떤 도움이라도 대단히 감사하겠습니다.

+0

누가 스레드를 취소할지 결정합니다 : 발신자 또는 웹 서비스 구현 (아마도 일부 제한 시간 기준)? –

답변

1

상태 변수를 설정하는 웹 서비스에 Cancel() 메소드를 추가하십시오. 그런 다음 장기 실행 작업을 주기적으로 주기적으로 확인하고 해당 집합 (적절한 보호 기능 포함)을 중지하십시오.

+0

나는 단순함으로 인해 당신의 대답을 간과했다고 믿을 수 없다. 하지만 Occam의 면도칼에서 알 수 있듯이 가장 단순한 대답이 가장 좋습니다. 다른 답변을 살펴본 후, Tejs의 대답은 제가 질문에서 언급했듯이 스레드를 취소하는 것이지만, 이것은 커밋되지 않은 데이터베이스 트랜잭션이 느리게 떠날 수 있다고 지적합니다. 그래서 저는 당신의 대답에 대해 더 생각했습니다. 당신의 방법으로, 나는 '취소'호출로 상태 (또는 세션) 변수를 설정 한 다음 루프의 다음 반복시에 해당 변수를 확인합니다. 과정에서 진행중인 모든 트랜잭션은 커밋되고 고아가되지 않습니다. – Keith

+0

도움이 된 것을 기쁘게 생각합니다. 간과하는 것에 대해 걱정하지 마라. 이것은 프로그래밍과 쌍을 이루는 다음으로 가장 좋은 방법이다.) – AdamC

0

물론 가능합니다. .NET 4를 사용하는 경우 다음 작업을 쉽게 취소 할 수 있습니다.

CancellationTokenSource cts = new CancellationTokenSource(); 
var processingTask = Task.Factory.StartNew(() => 
    { 
      foreach(var item in StuffToProcess()) 
      { 
       cts.Token.ThrowIfCancellationRequested(); 

       // Do your processing in a loop 
      } 
    }); 

    var cancelTask = Task.Factory.StartNew(() => 
     { 
      Thread.Sleep(/* The time you want to allow before cancelling your processing */); 
      cts.Cancel(); 
     }); 

    try 
    { 
     Task.WaitAll(processingTask, cancelTask); 
    } 
    catch(AggregateException ae) 
    { 
     ae.Flatten().Handle(x => 
      { 
       if(x is OperationCanceledException) 
       { 
        // Do Anything you need to do when the task was canceled. 
        return true; 
       } 

       // return false on any unhandled exceptions, true for handled ones 
      }); 
    } 
+0

이것은 내가 원했던 것과 비슷하지만 사용자가이 기능에 대한 요청 대기열을보고 특정 기능을 취소 할 수있는 요구 사항이 있습니다. 한 번에 이러한 요청 중 1-20 개가있을 수 있으며 특정 요청을 취소 할 수 있어야합니다. – Keith

+0

그런 경우, 일종의 공유 소유자 대신 해당 개체에 대한 참조를 유지해야합니다. 그런 다음 웹 관리자가 해당 작업에 대해 'cts.Cancel()'을 호출하도록 선택해야합니다. 지정된 토큰. – Tejs

+0

나는 이미 대기열 개체 (누가 어떤 날짜 범위를 동기화하도록 요청했는지 추적하는 db의 항목)를 추적합니다. 그럼, 그 스레드에 대한 토큰을 캡처하여 DB에 추가하고 위의 코드를 사용하여 스레드를 취소 할 수 있습니까? – Keith

1

당신은 웹 서비스 메소드에 필요

  1. StartCalculation (PARMS)를 장기 실행 작업을 spanws와 ID를 긴를 종료하여 계산을 취소
  2. CancelCalculation (ID)를 반환를 운영.

'장기 실행 작업'의 구현은 서비스 호스트 (IIS, Windows 서비스 등)에 따라 다릅니다.

+0

이것은 Adam의 권고와 비슷하다. 나는 처음에는 단순함 때문에이 답을 간과했다. 그러나 제가 선택한 이유에 대한 제 의견에 대한 아담의 대답을보십시오. – Keith

+0

Adam의 답변과 가장 큰 차이점은 작업을 식별하는 ID를 반환해야한다고 생각합니다. 그렇지 않으면 여러 클라이언트를 지원할 수 없습니다. ID가 없으면 둘 이상의 실행이있는 경우 어떤 작업을 취소할지 알 수 없습니다! –

+0

예, 어떤 반복이 발생했는지 추적하는 로그 테이블이 있습니다. 해당 반복의 ID를 반환하고 취소를 클릭하면 해당 ID가 취소 함수에 전달되고 취소 할 해당 ID로 응용 프로그램 변수가 설정됩니다. 다음 반복에서 ID가있는 것을 취소합니다. 정보 주셔서 감사합니다 – Keith