1

私が抱えている問題は、Silverlight アプリケーションに移植されたいくつかの asmx Web サービスにあります。問題は、Silverlight の asmx サービスが非同期メソッド呼び出しのみを許可することです。ほとんどの場合、これは受け入れられますが、本当にそれを望まない場合が 1 つあります。

Web 呼び出しの各ブロックの開始時に、グローバル関数 CheckTimeout への呼び出しがあります。これが行うことは、Web メソッドを呼び出して、ユーザーのログイン トークンの有効期限が切れているかどうかを確認することです。期限が切れている場合は、ユーザーがタイムアウトしたことを伝え、再度ログインしてください。問題は、CheckTimeout を返す前に完全に終了させたいことです。呼び出し元のメソッドが、さまざまなことを行う前に、まだログインしていることを認識していること。

サーバーから非同期の結果を受信するメソッドが通知する CheckTimeout 内で EventWaitHandler を使用してみましたが、実際にここで動作しているスレッドは 1 つだけだと思います。私がやりたいことをどのように行うことができるかについて何か考えはありますか?

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();


        }
    }
4

2 に答える 2

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);
}
于 2012-10-08T01:01:36.473 に答える
0

コードを別のメソッドに入れ (まだメソッドに含まれていない場合)、checklogin サービスを完了するためのハンドラーからそれを呼び出します。

于 2012-10-07T09:37:53.977 に答える