1

我遇到的问题是一些 asmx Web 服务已被移植到 Silverlight 应用程序。问题是silverlight 上的asmx 服务只允许异步方法调用。在大多数情况下,这是可以接受的,但有一种情况我真的不想要它。

在每个网络调用块的开始,都会调用一个全局函数 CheckTimeout。这样做是调用 web 方法来查看用户的登录令牌是否已过期,如果已过期,则表示用户已超时并请重新登录。问题是我希望 CheckTimeout 在返回之前完全完成调用方法在执行各种操作之前就知道您仍处于登录状态。

我尝试在 CheckTimeout 中使用 EventWaitHandler,从服务器接收异步结果的方法会发出信号,但我想这里实际上只有一个线程在工作,因为如果我这样做,甚至不会向 Web 服务器发出请求。关于如何做我想做的事有什么想法吗?

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 回答