尝试在Xamarin中使用SQLite执行异步操作时,应用程序挂起

时间:2019-06-07 20:21:22

标签: sqlite xamarin asynchronous async-await

在Xamarin应用程序中,我遇到了间歇性问题,它会无处不在。在检查了代码和输出日志,并仔细研究了一下之后,我发现UI线程上的数据负载过多。总而言之,这很好用:

public List<T> GetList(Expression<Func<T, bool>> expression)
{
    return Connection.Table<T>().Where(expression).ToList();
}

但是,应用程序在尝试调用该方法的异步版本时挂起:

public async Task<List<T>> GetList(Expression<Func<T, bool>> expression)
{
    return await AsyncConnection.Table<T>().Where(expression).ToListAsync();
}

我也想幻想,但是结果是一样的:

public async Task<List<T>> GetList(Expression<Func<T, bool>> expression)
{
    return await Task.Factory.StartNew(() => 
        { return Connection.Table<T>().Where(expression).ToList(); });
}

它的用法如下:

var lst = GetList(x => x.EntityName.Equals(entityMobile.EntityName)).Result

1 个答案:

答案 0 :(得分:0)

根据Stephen Cleary,这种情况会导致死锁。他的blog post详细介绍了两种解决方案。在我的情况下,我选择了后者(一直坚持异步):

public MyDAO
{
    // ...
    public async Task<List<T>> GetListAsync(Expression<Func<T, bool>> expression)
    { 
        return await AsyncConnection.Table<T>().Where(expression).ToListAsync();
    }
}

public MyViewModel
{
    private MyDAO _myDAO;
    //...

    public async void DoAsyncStuff()
    {
        var myList = await _myDao.GetListAsync(x => x.EntityName.Equals(entityMobile.EntityName));
    }
}

这是我实际拥有的东西的简化,但我想它将作为一个广泛的例子。在他的文章中可以找到更多这些内容。