我遇到的问题是一些已经移植到Silverlight应用程序的asmx Web服务。问题是Silverlight上的asmx服务只允许异步方法调用。在大多数情况下,这是可以接受的,但有一个例子,我真的不想要它。
在每个Web调用块的开头,都有一个对全局函数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();
}
}
答案 0 :(得分: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);
}
答案 1 :(得分:0)
将代码放入一个单独的方法中(如果它已经不在一个方法中)并从处理程序中调用该方法以完成checklogin服务。