내가 겪고있는 문제는 실버 라이트 애플리케이션으로 이식 된 일부 asmx 웹 서비스와 관련된 문제입니다. 문제는 Silverlight의 asmx 서비스가 비동기 메서드 호출 만 허용한다는 것입니다. 대부분이 부분은 받아 들일 만하지만 실제로 원하지 않는 경우가 하나 있습니다.비동기 웹 서비스 호출이 동기식으로 작동하도록하려면 어떻게해야합니까?
웹 호출의 모든 블록이 시작될 때 전역 함수 CheckTimeout이 호출됩니다. 이 기능은 웹 메소드를 호출하여 사용자의 로그인 토큰이 만료되었는지 여부를 확인하고, 로그인 토큰이 만료되었다고 말하면 사용자가 시간 초과되었습니다. 다시 로그인하십시오. 문제는 CheckTimeout이 리턴되기 전에 완전히 종료되도록하려는 것입니다. 호출하는 방법은 다양한 작업을 수행하기 전에 계속 로그인했음을 알고 있습니다.
서버에서 비동기 결과를 수신하는 메서드가 신호를 보내는 CheckTimeout 내에서 EventWaitHandler를 사용하여 시도했지만 실제 웹 서버에 요청이 이루어지지 않았으므로 여기서 한 스레드 만 작동한다고 생각합니다. 그런 식으로. 내가하고 싶은 일을 어떻게 할 수 있는지에 대한 생각?
private static EventWaitHandle wait_for_check_login = new AutoResetEvent(false);
private static bool check_timeout_result = false;
public static void CheckTimeout()
{
rji_ws.CheckLoginAsync(login_key);
wait_for_check_login.WaitOne();
if (check_timeout_result)
{
check_timeout_result = false;
return;
}
else
{
MessageBox.Show("You've timed out after a period of inactivity. Please log in again");
login_key = Guid.Empty;
System.Windows.Browser.HtmlPage.Document.Submit();
}
}
private static void CheckTimeoutResults(object sender, RJI_WS.CheckLoginCompletedEventArgs e)
{
if (e.Error != null)
{
//MessageBox.Show("There was an error communicating with the server
wait_for_check_login.Set();
}
else
{
check_timeout_result = e.Result;
wait_for_check_login.Set();
}
}