Заполнение сетки данных методом асинхронного ожидания - PullRequest
0 голосов
/ 05 ноября 2018

мой английский не очень хорош, извините за это, но я стараюсь рассказать о своей проблеме отлично

вот что у меня есть для загрузки сетки данных

private Task Loading(Func<string> SearchStringForUser)
{

    return Task.Run(() =>
    {

        var query = database.Database.SqlQuery<VW_Users>("select * From VW_Users where 1 = 1 And GymID = " + PublicVar.ID + " " + SearchStringForUser());
        var user = query.ToList();
        Dispatcher.InvokeAsync(() =>
        {
            DataGrid_User.ItemsSource = user;
        });
    });
}

обо всем по порядку у меня есть InvokeAsync, но он не работает идеально, я имею в виду, что моя программа зависает при загрузке данных в список. Во всяком случае, это не моя главная проблема, но если кто-то знает, что это за причина, может указать на это но моя главная проблема, когда у меня + 200 строк. Программа не загружает все даты в течение 30 или более сеансов. Похоже, моя сетка данных пуста в течение 30 и более сеансов.

я хочу загрузить данные на 10 строк по 10 строк, я имею в виду, что я хочу заполнить свою сетку данных после загрузки 10 строк после следующих 10 строк, лайк 10 20 30 40 .... с этим моя датагрид никогда не опустеет и данные будут загружаться медленно может кто-нибудь сказать мне лучший способ сделать это?

1 Ответ

0 голосов
/ 05 ноября 2018

Вы должны вызывать базу данных в фоновом потоке, но установить свойство ItemsSource в потоке пользовательского интерфейса. Таким образом, ваш Task должен вернуть IEnumerable<User>, но не касайтесь DataGrid. Затем вы можете ждать Task.

Это должно работать при условии, что метод Loading вызывается из потока пользовательского интерфейса:

private async Task Loading(Func<string> SearchStringForUser)
{
    var user = await Task.Run(() =>
    {
        var query = database.Database.SqlQuery<VW_Users>("select * From VW_Users where 1 = 1 And GymID = " + PublicVar.ID + " " + SearchStringForUser());
        return query.ToList();
    });
    DataGrid_User.ItemsSource = user;
}

Но так как запрос возвращает все строки одновременно, «при загрузке 10 строк» ​​не существует. Вы получаете их все сразу. Если вы не хотите этого, вам нужно использовать какой-нибудь считыватель данных, чтобы читать записи одну за другой. Вы можете создать ObservableCollection и заполнять его через определенные промежутки времени. Вот пример, который должен дать вам идею:

ObservableCollection<VW_Users> collection = new ObservableCollection<VW_Users>();
object @lock = new object();
BindingOperations.EnableCollectionSynchronization(collection, @lock);
DataGrid_User.ItemsSource = collection;

Task.Run(() =>
{
    using (SqlConnection connection = new SqlConnection("connection string...."))
    {
        SqlCommand command = new SqlCommand("select * From VW_Users where GymID = @GymId", connection);
        command.Parameters.AddWithValue("GymId", PublicVar.ID + " " + SearchStringForUser());
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();
        if (reader.HasRows)
        {
            const int N = 10;
            VW_Users[] cache = new VW_Users[N];
            int counter = 0;
            while (reader.Read())
            {
                VW_Users obj = new VW_Users();
                obj.Property1 = Convert.ToString(reader["Column1"]);
                cache[counter] = obj;
                //...and so on for each property...

                if (++counter == N)
                {
                    //add N items to the source collection
                    foreach (VW_Users x in cache) collection.Add(x);
                    counter = 0;
                    //add a delay so you actually have a chance to see that N items are added at a time
                    System.Threading.Thread.Sleep(1000);
                }
            }
            //add any remaining items
            for (int i = 0; i<counter; ++i) collection.Add(cache[i]);
        }
        reader.Close();
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...