我有一个执行以下操作的功能:
public class UserClass
{
public static CurrentUserData GetUserInfo()
{
CurrentUserData ui;
ui = GetUserData();
return ui;
}
}
我的CurrentUserData对象如下:
public class CurrentUserData
{
public bool ReadOnly{get;set;}
}
在我的控制器中,我调用我的方法,可以看到ReadOnly属性正常:
var user = UserClass.GetUserInfo();
if (user.ReadOnly)
{
////code to execute
}
我不得不在我的函数中添加一个异步调用,现在它看起来像这样(为了简洁我省略了代码):
public static Task<CurrentUserData > GetUserInfo()
{
Task<CurrentUserData > ui;
ui = GetUserData();
HttpResponseMessage response = await httpClient.SendAsync(request);
return ui;
}
注意我必须添加的任务。但是当我像以前一样在我的控制器中调用该方法时,我得到错误:
Error CS1061 'Task<CurrentUserData >' does not contain a definition for
'ReadOnly' and no extension method 'ReadOnly' accepting a first argument of
type 'Task<CurrentUserData >' could be found (are you missing a using directive or
an assembly reference?)
我需要更改什么,所以当任何类调用我的新Task方法时,它会看到对象的所有属性都包含在Task中?
答案 0 :(得分:5)
将您要返回的GetUserInfo
方法async
和await
任务标记为其他方法:
public static async Task<UserClass> GetUserInfo()
{
Task<UserClass> ui = GetUserData();
HttpResponseMessage response = await httpClient.SendAsync(request);
return ui;
}
//and then
var user = await UserClass.GetUserInfo();
if (user.ReadOnly)
{
// code to execute
}
这将使任务返回等待完成,然后您可以继续生成user
对象。
请务必遵循async all the way。
答案 1 :(得分:1)
更正您的代码
async
关键字必须位于返回类型的前面。
public static async Task<UserClass> GetUserInfo()
{
Task<UserClass> ui;
ui = GetUserData();
HttpResponseMessage response = await httpClient.SendAsync(request);
return ui;
}
然后使用
var user = await UserClass.GetUserInfo();
if (user.ReadOnly)
{
// your code here
}
答案 2 :(得分:1)
您应该等待对UserClass.GetUserInfo();
的调用var user = await UserClass.GetUserInfo();
if (user.ReadOnly){
////code to execute
}
,方法签名应为:
public async static Task<CurrentUserData> GetUserInfo()
答案 3 :(得分:0)
首先,除非await
运算符的方法也是async
,否则甚至不应该编译:
public static async Task<CurrentUserData> GetUserInfo()
一旦出现这种情况,您只需等待任何其他async
方法的方法:
var user = await UserClass.GetUserInfo();
本身采用async
方法:
public static async Task<CurrentUserData> GetUserInfo()
等等一直到堆栈的顶部。