들어오는 사용자 요청이 처리되는 프로세스가 있습니다. 또한 주 프로세스의 응답성에 영향을주지 않으면 서 요청에 대한 일부 메타 데이터를 데이터베이스 테이블에 추가하려고합니다. 이를 달성하기 위해이 같은 비동기 메서드 호출을 추가 :비동기 메서드가 완전히 실행되지 않는 것 같습니다
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()가 실행되지 않습니다.
개정 요약 문제는
나의 현재의 생각은 웹 서비스가 작업 및 비동기가 더 이상 존재하지 호출되지 스레드를 완료하는 것이 더 간결해야합니다. 비동기 호출이 완료되지 않게할까요?
이 시나리오에서 EndInvoke를 배치하는 방법을 정확히 모르겠습니다. 나는 일반적으로 잘 작동하는 콜백을 수행하기 위해 Linq를 사용하고있다 (확실히 나의 단위 테스트에서). 콜백에 대해 신경 쓰지 않아도되는 경우입니다 ... 나는 단지 새로운 액션이 호출 프로세스를 차단하지 않고 그 일을 수행하기를 원합니다. –
EndInvoke가 무엇을했는지 이해할 수 없기 때문에 필요한지 여부를 알 수 없습니다. 나는 당신이 이해하지 못하는 문제와 동시에 이해되지 않는 두 가지 사이의 연관성이있을 수 있다고 제안합니다. –
MSDN 문서에서는 "어떤 기술을 사용하든 비동기 호출을 완료하기 위해 항상 EndInvoke를 호출하십시오."라고 말합니다. http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx 나는 너희들이 옳다고 생각하기 시작하고 – Clyde