Skip to main content
 首页 » 编程设计

c#之WebMethod 异步结果显示对象

2024年02月05日27haluo1

我正在尝试使用异步返回结果,但不是返回我想要的数据,而是返回整个对象

[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 的结果。这也意味着代码实际上并不是异步的。