Приложение зависает при попытке выполнить асинхронные операции с SQLite в Xamarin - PullRequest
0 голосов
/ 07 июня 2019

В приложении Xamarin у меня периодически возникает проблема, из-за которой оно закрывается из ниоткуда. Изучив код и журнал вывода и немного погуглив, я понял, что в потоке пользовательского интерфейса слишком много данных. Подводя итог, это прекрасно работает:

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 голосов
/ 10 июня 2019

Согласно Стивену Клири , эта ситуация заходит в тупик.Его сообщение в блоге подробно описывает два решения.Я выбрал последнее в моем случае (просто придерживайтесь асинхронного полностью):

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));
    }
}

Это упрощение того, что у меня есть на самом деле, но я полагаю, что это будет в качестве широкого примера.Больше из них можно найти в его статье.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...