sqlite-net 和 xamarin 表单中的异步方法
sqlite-net and Async methods in xamarin forms
如问题标题所述,我在 xamarin forms shell 应用程序中使用 sqlite-net nuget 包。我选择在我的应用程序中使用 sqlite API 的异步版本。我开发了一种方法,但实际上我不确定这是否正确。从技术上讲,它确实有效,而且它做了我想要它做的事情,但我想知道这是否真的是最好的方法。这是有问题的方法
public async static Task<List<BPEntry>> GetAllBP()
{
var query = database.Table<BPEntry>();
var result = await query.ToListAsync();
return result;
}
我感到困惑的部分是,当您在 query.ToListAsync()
上使用 await 运算符时,它会返回 List<BPEntry>
object.
现在,我想 return 那个 List<BPEntry>
object 到调用方法,但是由于我理解异步方法的工作方式,我不能只传回直接List<BPEntry>
。
相反,我被迫 return 包含列表的 Task
。这意味着我也必须将调用方法设置为 I。
我觉得这很奇怪。为什么我不能直接将 List<BPEntry>
object 传回给 non-async 调用方法?
这几乎就像您解压操作以获得 List<BPEntry>
一样,但是您必须将其包装回任务中,而不是直接将其传回。这对我来说似乎是多余的。
那么我这样做正确吗?
有什么我想念的吗?
或者这就是异步方法在 C# 中的工作方式?
你从sqlite数据库中获取数据的代码,我认为是正确的,但你也可以试试下面的代码。
public async Task<List<Energys>> GetAlldata()
{
var data = await conn.Table<Energys>().ToListAsync();
return data;
}
private async void GetDataAsync()
{
List<Energys> list = await GetAlldata();
}
如果你想让调用方法不异步,你有几个选择
First是最简单的,从Task中获取Result
属性即可,但这会导致死锁,阻塞当前线程直到返回结果,这是不好的。
您还有另一种选择,即将调用包装在 Task.Run()
中,然后从中获取 Result
,这会将任务查询到另一个线程,因此不会阻塞。
没有理由不能使调用方法异步,如果您使方法异步,通常它上面的所有其他内容(调用它)也应该是异步的。
我们使用异步的原因是为了避免阻塞,通常在 UI 应用程序中,例如 Xamarin.Forms 或 WPF,例如允许在屏幕上放置加载屏幕甚至动画在加载数据库时,或者仍然让用户在这部分加载时处理应用程序的其他部分。
如果您不需要,则只需使用同步 API。但是,如果您正在制作 Xamarin 应用程序,也就是移动应用程序,那么响应能力非常重要,您不希望应用程序占用整个屏幕而只是挂起而没有任何迹象表明它仍在工作,并且正在努力工作。
考虑观看或阅读有关异步的一些教程以获取更多信息。
如问题标题所述,我在 xamarin forms shell 应用程序中使用 sqlite-net nuget 包。我选择在我的应用程序中使用 sqlite API 的异步版本。我开发了一种方法,但实际上我不确定这是否正确。从技术上讲,它确实有效,而且它做了我想要它做的事情,但我想知道这是否真的是最好的方法。这是有问题的方法
public async static Task<List<BPEntry>> GetAllBP()
{
var query = database.Table<BPEntry>();
var result = await query.ToListAsync();
return result;
}
我感到困惑的部分是,当您在 query.ToListAsync()
上使用 await 运算符时,它会返回 List<BPEntry>
object.
现在,我想 return 那个 List<BPEntry>
object 到调用方法,但是由于我理解异步方法的工作方式,我不能只传回直接List<BPEntry>
。
相反,我被迫 return 包含列表的 Task
。这意味着我也必须将调用方法设置为 I。
我觉得这很奇怪。为什么我不能直接将 List<BPEntry>
object 传回给 non-async 调用方法?
这几乎就像您解压操作以获得 List<BPEntry>
一样,但是您必须将其包装回任务中,而不是直接将其传回。这对我来说似乎是多余的。
那么我这样做正确吗?
有什么我想念的吗?
或者这就是异步方法在 C# 中的工作方式?
你从sqlite数据库中获取数据的代码,我认为是正确的,但你也可以试试下面的代码。
public async Task<List<Energys>> GetAlldata()
{
var data = await conn.Table<Energys>().ToListAsync();
return data;
}
private async void GetDataAsync()
{
List<Energys> list = await GetAlldata();
}
如果你想让调用方法不异步,你有几个选择
First是最简单的,从Task中获取Result
属性即可,但这会导致死锁,阻塞当前线程直到返回结果,这是不好的。
您还有另一种选择,即将调用包装在 Task.Run()
中,然后从中获取 Result
,这会将任务查询到另一个线程,因此不会阻塞。
没有理由不能使调用方法异步,如果您使方法异步,通常它上面的所有其他内容(调用它)也应该是异步的。
我们使用异步的原因是为了避免阻塞,通常在 UI 应用程序中,例如 Xamarin.Forms 或 WPF,例如允许在屏幕上放置加载屏幕甚至动画在加载数据库时,或者仍然让用户在这部分加载时处理应用程序的其他部分。
如果您不需要,则只需使用同步 API。但是,如果您正在制作 Xamarin 应用程序,也就是移动应用程序,那么响应能力非常重要,您不希望应用程序占用整个屏幕而只是挂起而没有任何迹象表明它仍在工作,并且正在努力工作。
考虑观看或阅读有关异步的一些教程以获取更多信息。