如何从异步函数 C# 返回字符串而不是 SYSTEM.THREADING.TASK.TASK`1[SYSTEM.STRING]
Posted
技术标签:
【中文标题】如何从异步函数 C# 返回字符串而不是 SYSTEM.THREADING.TASK.TASK`1[SYSTEM.STRING]【英文标题】:How can I return a string rather than SYSTEM.THREADING.TASK.TASK`1[SYSTEM.STRING] from an async function C# 【发布时间】: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;
【参考方案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
。谷歌了解差异和后果。
【讨论】:
以上是关于如何从异步函数 C# 返回字符串而不是 SYSTEM.THREADING.TASK.TASK`1[SYSTEM.STRING]的主要内容,如果未能解决你的问题,请参考以下文章
我的 C++ 程序集是如何从 C# 控制台应用程序而不是 ASP.NET 中看到的?
为啥我的异步函数返回 Promise <pending> 而不是一个值?