需要帮助在异步任务中生成列表

时间:2019-05-16 14:12:19

标签: c# async-await

我正在尝试使用一个异步任务,通过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的错误

2 个答案:

答案 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>的方法应该是asyncawait或返回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");
}