在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
答案 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));
}
}
这是我实际拥有的东西的简化,但我想它将作为一个广泛的例子。在他的文章中可以找到更多这些内容。