2012-10-06 2 views
1

내가 겪고있는 문제는 실버 라이트 애플리케이션으로 이식 된 일부 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(); 


     } 
    } 

답변

1

전화가 서버로 연결되지 않으면 CheckLoginAsync 코드에서 뭔가를 놓친 것일 수도 있습니다 (사용자가 게시하지 않았 음).

어쨌든이 방법으로 코드를 작성하면 기본 UI 스레드가 차단됩니다. 다음과 같은 방법으로 코드를 정렬하는 것이 좋습니다.

/// Usage: 
/// CheckLoginThen((bool result) => { CallWebServices(); }); 
void CheckLoginThen(Action<bool> a) 
{ 
    rji_ws.CheckLoginAsync(login_key, 
    (sender, e) => 
    { 
     if (e.Error != null) 
     { 
     MessageBox.Show("There was an error communicating with the server"); 
     } 
     else 
     { 
     var result = e.Result; 
     a(result); 
     } 
    }, 
    null); 
} 
0

코드를 별도의 메소드에 넣고 (이미없는 경우) checklogin 서비스를 위해 핸들러에서 호출하십시오.

관련 문제