我有一个来自jquery的web服务的两个ajax调用。
第一个调用(GetMessages
)在javascript(setInterval
)中启动一个间隔,并返回存储在会话变量中的字符串数组。
第二次调用(UploadUsers
)上传用户并将状态保存在方法GetMessages
中以返回。因此,UploadUsers向Session添加消息,GetMessages检索消息并为客户端显示消息。
问题是即使我异步调用这两个方法,GetMessages
等待UploadUsers
完成。它只是加载。
我甚至在每个添加的用户之间添加了一个thread.sleep,我希望GetMessages
返回“已添加1/10用户”,“已添加2/10个用户”,每个用户都有不同的通话
GetMessages
在UploadUsers
完成之前不会返回任何内容,然后立即显示所有文本。
我有很多代码,所以我不知道该放什么,但在这里:
UploadUsers.aspx
callAsynchMethod('ClientStatusHandler.asmx/GetMessages',
'', printMessages, stopPollingError);
callAsynchMethod('ClientStatusHandler.asmx/StartRetrievingLeads',
data, stopPolling, stopPollingError);
Site.js
function callAsynchMethod(url, keyValue, callBack, callBackError) {
$.ajax({
type: "POST",
url: url,
data: keyValue,
contentType: "application/json; charset=utf-8",
success: callBack,
error:callBackError
});
}
ClientStatusHandler.asmx.cs
const string key = "LUMessages";
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
[WebMethod(EnableSession = true)]
public string[] GetMessages()
{
if (Session[key] != null)
{
string[] messages = ((IList<string>)Session[key]).ToArray();
((IList<string>)Session[key]).Clear();
return messages;
}
return new string[] { };
}
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
[WebMethod(EnableSession = true)]
public string[] UploadUsers()
{
//This function adds a user and calls SaveMessageToQueue
//for every user.
//I see the message being entered into the session and
//I call Thread.Sleep(10000)
//between messages.
}
private void SaveMessageToQueue(string m)
{
IList<string> messageQueue = (List<string>)HttpContext.Current.
Session["LUMessages"];
messageQueue.Add(m);
}
答案 0 :(得分:4)
这是因为您启用了Session和Session会锁定所有调用,直到它们返回。
您还可以阅读此问题:Replacing ASP.Net's session entirely