2009-06-18 6 views
0

들어오는 사용자 요청이 처리되는 프로세스가 있습니다. 또한 주 프로세스의 응답성에 영향을주지 않으면 서 요청에 대한 일부 메타 데이터를 데이터베이스 테이블에 추가하려고합니다. 이를 달성하기 위해이 같은 비동기 메서드 호출을 추가 :비동기 메서드가 완전히 실행되지 않는 것 같습니다

public static ReturnObject ResponsiveMethod(string ip, string code) 
{ 
    // ... some reasonably quick code 

    IPDetail.InsertAsync(ip); // <-- call to the async method 

    return new ReturnObject(code); 
} 

InsertAsync() 메소드는 다음과 같습니다

public static void InsertAsync(string ipAddress) 
    { 
     Action action =() => IPDetail.Insert(ipAddress); 
     action.BeginInvoke(aResult => Log.Debug("Completed Insert"), null); 
    } 

그리고를 마지막으로 삽입라는 일반적으로 비 비동기 방식() :

private static void Insert(string ipAddress) 
    { 
     ApplicationContextHelper.LoadApplicationContext(); 
     var helper = new GeoLocationHelper(); 
     var result = helper.GetDetailsFromIP(ipAddress); 
     Log.InfoFormat("Succesfully retreived IP data {0}.", ipAddress); 
     result.Save(); 
    } 

내 단위 테스트에서는 InsertAsync() 호출이 완벽하게 작동합니다. insert()에서 메소드를 호출하면 로깅에 의해 자세하게 설명되는 많은 연산이 발생하고 예상되는 모든 로그 메시지는 물론 result.Save() 메소드의 최종 결과가 나타납니다.

그러나 우리는 위의 ResponsiveMethod() 메소드와 같은 것을 사용하는 webservice를 가지고 있으며 어떤 이유로 비동기 호출이 완료되지 않습니다. LoadApplicationContext() 메서드의 모든 로깅이 시작되지만 그 이후에는 Insert()와 관련된 로그 작업이없고 result.Save()가 실행되지 않습니다.

개정 요약 문제는

나의 현재의 생각은 웹 서비스가 작업 및 비동기가 더 이상 존재하지 호출되지 스레드를 완료하는 것이 더 간결해야합니다. 비동기 호출이 완료되지 않게할까요?

답변

1

이전에는 BeginInvoke를 사용 해본 적이 없지만 보통 Begin *이있는 곳에서는 해당 End *가 필요합니다. 정확한 예외 처리와 함께 하나를 추가하십시오.

+0

이 시나리오에서 EndInvoke를 배치하는 방법을 정확히 모르겠습니다. 나는 일반적으로 잘 작동하는 콜백을 수행하기 위해 Linq를 사용하고있다 (확실히 나의 단위 테스트에서). 콜백에 대해 신경 쓰지 않아도되는 경우입니다 ... 나는 단지 새로운 액션이 호출 프로세스를 차단하지 않고 그 일을 수행하기를 원합니다. –

+0

EndInvoke가 무엇을했는지 이해할 수 없기 때문에 필요한지 여부를 알 수 없습니다. 나는 당신이 이해하지 못하는 문제와 동시에 이해되지 않는 두 가지 사이의 연관성이있을 수 있다고 제안합니다. –

+0

MSDN 문서에서는 "어떤 기술을 사용하든 비동기 호출을 완료하기 위해 항상 EndInvoke를 호출하십시오."라고 말합니다. http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx 나는 너희들이 옳다고 생각하기 시작하고 – Clyde

0

내 첫 번째 생각은 어떤 이유로 웹 서비스 시나리오에서 비동기 호출에 예외가 발생할 수 있다는 것입니다. 나는 당신이 아마 그것을 웹상에 게시하기 위해 노력했지만 거기에 어떤 "더 많거나 적음"오류 처리 코드가 있는가?

+0

몇 가지 예외가있을 수 있지만 매우 잘 처리되며 최악의 경우 자세한 로그 메시지가 표시됩니다. –

+0

확인. 비동기 호출은 ThreadPool 스레드에 있어야하므로 원래 스레드가 완료되고 종료되는지는 중요하지 않습니다. – Clyde

0

비동기 메서드 호출에서 호출자의 ID를 사용하고 있습니까? 웹 서비스에서 호출되면 ID가 손실 될 수 있습니다.

+0

좋은 질문이지만, 나는 우리가 Identity를 꽤 사용하는 경향이 있기 때문에 확신하지 못했다. 그러나, 나는 이것이 여기에 해당한다고 생각하지 않는다. 로그 트레일은 Identity가 사용될 수있는 영역보다 먼저 중지되며, 문제가 발생한 경우 예외가 발생하고 기록됩니다. –

관련 문제