私が抱えている問題は、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();
}
}