Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从异步函数C返回字符串而不是SYSTEM.THREADING.TASK.TASK`1[SYSTEM.string]#_C#_Sqlite_Xamarin_Xamarin.forms - Fatal编程技术网

C# 如何从异步函数C返回字符串而不是SYSTEM.THREADING.TASK.TASK`1[SYSTEM.string]#

C# 如何从异步函数C返回字符串而不是SYSTEM.THREADING.TASK.TASK`1[SYSTEM.string]#,c#,sqlite,xamarin,xamarin.forms,C#,Sqlite,Xamarin,Xamarin.forms,我正在构建的Xamarin应用程序中有一个SQLite数据库,用于存储和检索有关动物的信息。我的SQLite异步函数之一是根据传入该函数的动物名称获取动物的饮食。从这个函数中,我试图返回一个字符串,该字符串将被找到,但此时它正在返回值SYSTEM.THREADING.TASK.TASK`1[SYSTEM.string]。我已经尝试了我所有的想法,但没有任何效果。任何帮助都将不胜感激 动物类: public class Animal { [PrimaryKey, AutoIncre

我正在构建的Xamarin应用程序中有一个SQLite数据库,用于存储和检索有关动物的信息。我的SQLite异步函数之一是根据传入该函数的动物名称获取动物的饮食。从这个函数中,我试图返回一个字符串,该字符串将被找到,但此时它正在返回值SYSTEM.THREADING.TASK.TASK`1[SYSTEM.string]。我已经尝试了我所有的想法,但没有任何效果。任何帮助都将不胜感激

动物类:

    public class Animal
{
    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }
    [NotNull]
    public string Name { get; set; }
    [NotNull]
    public string Diet { get; set; }
    [NotNull]
    public string Markings { get; set; }
    [NotNull]
    public string Ecosystem { get; set; }

}
public async Task<string> getAnimalDiet(string animalName)
    {
       
            Animal a =  await Database.Table<AnimalInfo>().Where(x => x.Name == animalName).FirstOrDefaultAsync();
            return await Task.FromResult(a.Diet);

    }
}

用于检索饮食的SQLite函数:

    public class Animal
{
    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }
    [NotNull]
    public string Name { get; set; }
    [NotNull]
    public string Diet { get; set; }
    [NotNull]
    public string Markings { get; set; }
    [NotNull]
    public string Ecosystem { get; set; }

}
public async Task<string> getAnimalDiet(string animalName)
    {
       
            Animal a =  await Database.Table<AnimalInfo>().Where(x => x.Name == animalName).FirstOrDefaultAsync();
            return await Task.FromResult(a.Diet);

    }
public异步任务getAnimalDiet(字符串animalName)
{
Animal a=wait Database.Table()。其中(x=>x.Name==animalName.FirstOrDefaultAsync();
返回等待任务。FromResult(a.Diet);
}
在我的Xamarin中调用此函数(其中返回SYSTEM.THREADING.TASK.TASK`1[SYSTEM.STRING]而不是作为字符串的饮食)

void getDiet(列表最终版)
{  
找到的列表=新列表();
如果(final.Count>0)
{
foreach(决赛中的弦乐动物)
{
found.Add(App.Database.getAnimalDiet(animal.ToString());
}
foreach(找到的字符串条目)
{
新按钮创建(条目);
}
}
}
您可以替换

return await Task.FromResult(a.Diet);

为了同样的结果

您的问题不在于如何编写getAnimalDiet(),而在于如何调用它,需要等待:

  //found.Add(App.Database.getAnimalDiet(animal).ToString());
  found.Add(await App.Database.getAnimalDiet(animal));
但这意味着
void getDiet()
必须变成
async Task getDiet()
async void getDiet()


更喜欢
异步任务
,然后逐步提升。只有顶级方法和事件处理程序应该是
async void
。谷歌搜索差异和后果。

不是。默认情况下,异步方法返回ask。他们就是这么做的。如果您使用的是异步方法,请等待它,或者调用
.Result
。我建议阅读异步方法的工作原理。实际上,不要调用
.Result
.Wait
或任何类似的
异步方法,除非您确切知道自己在做什么,否则等待它改进:
返回Wait Task.FromResult(a.Diet)->
返回等待a.饮食