我正在尝试使用异步返回结果,但不是返回我想要的数据,而是返回整个对象
[System.Web.Services.WebMethod(BufferResponse=false)]
public static async Task<bool> getLogin(string username, string password)
{
Login login = new Login();
Task<bool> loginVerify = login.verifyLogin(username,password);
await loginVerify;
return loginVerify.Result;
}
public class Login
{
public async Task<bool> verifyLogin(string username, string password)
{
return true;
}
}
Firefox Firebug 的结果显示:
{"d":{"Result":true,"Id":2,"Exception":null,"Status":5,"IsCanceled":false,"IsCompleted":true,"CreationOptions":0,"AsyncState":null,"IsFaulted":false}}
为什么不直接显示结果呢?
我试过运行
public static async Task<bool> getLogin(string username, string password)
{
Login login = new Login();
Task<bool> loginVerify = login.verifyLogin(username,password);
await loginVerify;
return false;
}
但是 Firebug 报告是一样的,只是它在 json 中说 Result false
{"d":{"Result":false,"Id":2,"Exception":null,"Status":5,"IsCanceled":false,"IsCompleted":true,"CreationOptions":0,"AsyncState":null,"IsFaulted":false}}
所以我的问题是为什么它显示整个对象而不是结果?
请您参考如下方法:
如 this answer 中所述,WebMethod不支持async-await(它支持另一种异步模式,APM,你可以转换async-await 到 APM,但这很尴尬)。
那么为什么会得到如此奇怪的结果呢? WebMethod 不知道 Task 是某种特殊类型,因此它通过访问和序列化其属性将其视为常规对象。这包括 Result,它同步返回 Task 的结果。这也意味着代码实际上并不是异步的。
