我正在尝试使用一个异步任务,通过sqlite.net从我的sqlite数据库中读取内容,而我的基本类是下面的这个类:
public class Students
{
public string Fullname { get; }
public string Admnumber { get; }
}
实现该库的简单示例是:
public static IEnumerable<Students> QueryVals ()
{
var db = new SQLiteConnection("Data Source=assets\\mydb.db;New=False;Version=3");
return db.Query<Students> ("select * from students");
}
但是现在当我尝试使用它时,async
任务如下:
public static Task<Students> GetStudentsList ()
{
var db = new SQLiteConnection("Data Source=assets\\mydb.db;New=False;Version=3");
return db.Query<Students> ("select * from students");
}
我得到一个错误:
无法隐式转换类型 'System.Collection.Generic.List'到 'System.Threading.Tasks.Task'
即使是轮胎也不起作用:
private async void Init()
{
IsBusy = true;
var db = new SQLiteConnection("Data Source=assets\\mydb.db;New=False;Version=3");
var myitems = await db.Query<Students>("select * from students");
IsBusy = false;
}
在我完成之前,它给出了我的课程Students
没有GetAwaiter的错误
答案 0 :(得分:4)
您不能仅仅通过将返回类型更改为Task<T>
来使异步操作。首先,您需要切换为使用SQLiteAsyncConnection
对象和Query
方法的异步版本:
new SQLiteAsyncConnection("...");
...
db.QueryAsync<Students>("select * from students");
// ^^^^^
// Add this
现在您有两个选择。首先是await
的结果,如answer by mm8所示。另一种,也许是我会选择的一种,就是返回任务并让调用者await
:
public static Task<IEnumerable<Students>> GetStudentsListAsync()
{
var db = new SQLiteAsyncConnection("Data Source=assets\\mydb.db;New=False;Version=3");
return db.QueryAsync<Students>("select * from students");
}
请注意,我也使用重命名方法的通用约定来表明它是异步的。
答案 1 :(得分:3)
返回Task<T>
的方法应该是async
和await
或返回Task
。
您可以在方法中添加async
关键字,并在异步await
方法中添加QueryAsync
:
public static async Task<IEnumerable<Students>> GetStudentsListAsync()
{
var db = new SQLiteAsyncConnection("Data Source=assets\\mydb.db;New=False;Version=3");
return await db.QueryAsync<Students>("select * from students");
}
或返回方法的调用者等待的未完成任务:
public static Task<IEnumerable<Students>> GetStudentsListAsync()
{
var db = new SQLiteAsyncConnection("Data Source=assets\\mydb.db;New=False;Version=3");
return db.QueryAsync<Students>("select * from students");
}