C# xamarin表单无法隐式转换类型';system.threading.tasks.task<;System.collections.generic列表到System.collections.generic列表
您好,我是编程新手,但目前我遇到了xamarin forms无法将类型“system.threading.tasks.task>隐式转换为system.collections.generic.List 因为我尝试在启动应用程序时使用全局变量来优化应用程序 当我试图将菜单项列表设置为其他页面将访问的全局变量时,它给了我这个错误。我不知道如何解决这个问题,所以请有人帮助我 这是我的 App.csC# xamarin表单无法隐式转换类型';system.threading.tasks.task<;System.collections.generic列表到System.collections.generic列表,c#,generics,asynchronous,visual-studio-2015,xamarin.forms,C#,Generics,Asynchronous,Visual Studio 2015,Xamarin.forms,您好,我是编程新手,但目前我遇到了xamarin forms无法将类型“system.threading.tasks.task>隐式转换为system.collections.generic.List 因为我尝试在启动应用程序时使用全局变量来优化应用程序 当我试图将菜单项列表设置为其他页面将访问的全局变量时,它给了我这个错误。我不知道如何解决这个问题,所以请有人帮助我 这是我的 App.cs private static int globalVariable=1; public static L
private static int globalVariable=1;
public static List foodList=new List();
私有静态列表beverageList=新列表();
公共静态整数全局变量
{
获取{return globalVariable;}
设置{globalVariable=value;}
}
公共静态列表食物列表
{
获取{return foodList;}
设置{foodList=value;}
}
公共静态列表
{
获取{return beverageList;}
设置{beverageList=value;}
}
公共应用程序()
{
全局变量=10;
BeverageList=getBeverageList();
FoodList=getFoodList();
}
公共异步任务getBeverageList()
{
康斯坦茨常数=新康斯坦茨();
HttpClient=新的HttpClient();
client.BaseAddress=新Uri(“http://172.20.129.44/");
//为JSON格式添加Accept标头。
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
HttpResponseMessage response=新的HttpResponseMessage();
response=client.GetAsync(“WebServices/menu.svc/GetBeveragesJSON”).Result;
if(响应。IsSuccessStatusCode)
{
string jsonString=await response.Content.ReadAsStringAsync();
动态dynamicObject=JsonConvert.DeserializeObject(jsonString);
int itemId;
字符串itemName;
字符串itemCategory;
字符串项子类别;
字符串项描述;
字符串项图像;
int itemQuantity;
双项目价格;
字符串itemStatus;
字符串itemAddOn;
for(int i=0;i
谢谢 您没有在
getBeverageList()
中执行任何async
,因此您可以安全地将其签名更改为
公共列表getBeverageList()
之后,您应该停下来几天,学习async/await和TPL…您在
getBeverageList()
中没有做任何事情async
,这样您就可以安全地将其签名更改为
公共列表getBeverageList()
在那之后,你应该停下来几天,首先学习async/await和TPL…你不应该在一个构造函数中做繁重的工作。第二,您正在调用一个异步方法,但没有等待它。因此,您将获得一项任务。因此,您需要编写
等待getBeverageList()
并将该方法标记为async。但是,构造函数不能是异步的,因此我建议将所有繁重的工作移到一个名为async void Init()
@Rob的方法中。我尝试将wait放在getBeverageList()前面,但它们会声明此方法不是asyn方法。此外,我无法将App()更改为async。异步void Init()是什么意思?有任何例子吗?有-因为App()
是一个构造函数。您需要创建一个名为任意名称的新方法,在我的示例中,它名为Init
。将该方法标记为Init()
,并将getBeverageList()
,getFoodList()
放在Init
函数中。当然,在创建了一个新的应用程序之后,您需要调用obj.Init()
。
@Rob sorry仍然听不懂您在说什么。。。你介意把代码写出来作为例子吗?谢谢大家!@Rob抱歉还是不明白你在说什么。。。你介意把代码写出来作为例子吗?非常感谢。公共应用程序(){InitBeverageAndFoodList();}公共异步void InitBeverageAndFoodList(){BeverageList=await getBeverageList();FoodList=await getFoodList();}成功了!首先谢谢你-你不应该在一个建造师里做繁重的工作。第二,您正在调用一个异步方法,但不是aw
private static int globalVariable = 1;
public static List<MenuItemModel> foodList = new List<MenuItemModel>();
private static List<MenuItemModel> beverageList = new List<MenuItemModel>();
public static int GlobalVariable
{
get { return globalVariable; }
set { globalVariable = value; }
}
public static List<MenuItemModel> FoodList
{
get { return foodList; }
set { foodList = value; }
}
public static List<MenuItemModel> BeverageList
{
get { return beverageList; }
set { beverageList = value; }
}
public App()
{
GlobalVariable = 10;
BeverageList = getBeverageList();
FoodList = getFoodList();
}
public async Task<List<MenuItemModel>> getBeverageList()
{
ConstantCS constant = new ConstantCS();
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://172.20.129.44/");
// Add an Accept header for JSON format.
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = new HttpResponseMessage();
response = client.GetAsync("WebServices/menu.svc/GetBeveragesJSON").Result;
if (response.IsSuccessStatusCode)
{
string jsonString = await response.Content.ReadAsStringAsync();
dynamic dynamicObject = JsonConvert.DeserializeObject(jsonString);
int itemId_;
string itemName_;
string itemCategory_;
string itemSubCategory_;
string itemDescription_;
string itemImage_;
int itemQuantity_;
double itemPrice_;
string itemStatus_;
string itemAddOn_;
for (int i = 0; i < dynamicObject.d.Count; i++)
{
itemId_ = dynamicObject.d[i]["itemID"];
itemName_ = dynamicObject.d[i]["itemName"].ToString();
itemCategory_ = dynamicObject.d[i]["itemCategory"].ToString();
itemSubCategory_ = dynamicObject.d[i]["itemSubCategory"].ToString();
itemDescription_ = dynamicObject.d[i]["itemDesc"].ToString();
itemImage_ = dynamicObject.d[i]["itemImg"].ToString();
itemQuantity_ = int.Parse(dynamicObject.d[i]["itemQty"].ToString());
itemPrice_ = double.Parse(dynamicObject.d[i]["itemPrice"].ToString());
itemStatus_ = dynamicObject.d[i]["itemStatus"].ToString();
itemAddOn_ = dynamicObject.d[i]["itemRequest"].ToString();
string itemURL_ = constant.PhotoBaseURL + itemImage_;
beverageList.Add(new MenuItemModel(itemId_, itemName_, itemCategory_, itemSubCategory_, itemDescription_, itemURL_, itemQuantity_, itemPrice_, itemStatus_, itemAddOn_));
}
}
else
{
//Debug.WriteLine("It entered else not if");
}
return beverageList;
}