【问题标题】:How can I return a string rather than SYSTEM.THREADING.TASK.TASK`1[SYSTEM.STRING] from an async function C#如何从异步函数 C# 返回字符串而不是 SYSTEM.THREADING.TASK.TASK`1[SYSTEM.STRING]
【发布时间】:2021-06-03 23:28:43
【问题描述】:

我正在构建的 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; }

}

}

用于检索饮食的 SQLite 函数:

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);

    }

在我的 Xamarin 中调用此函数(它返回 SYSTEM.THREADING.TASK.TASK`1[SYSTEM.STRING] 而不是饮食作为字符串)

void getDiet(List<string> final)
    {  
        List<string> found = new List<string>();
        if (final.Count > 0)
        {

            foreach(string animal in final)
            {

              found.Add(App.Database.getAnimalDiet(animal).ToString());

            }

            foreach(string entry in found)
            {
                NewButtonCreation(entry);
            }


        }
    }

【问题讨论】:

  • 不是。默认情况下,异步方法返回询问。这就是他们所做的。如果您使用异步方法,请等待它,或者调用.Result。我建议阅读异步方法的工作原理。
  • 实际上,永远不要在 async 方法上调用 .Result .Wait 或类似的东西,除非您确切知道自己在做什么,等待它
  • 改进:return await Task.FromResult(a.Diet); -> return await a.Diet;

标签: c# sqlite xamarin xamarin.forms


【解决方案1】:

你可以替换

return await Task.FromResult(a.Diet);

return 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 Task 并继续努力。只有顶级方法和事件处理程序应该是async void。谷歌了解差异和后果。

【讨论】:

    猜你喜欢
    • 2017-03-10
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 2015-02-18
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多