powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Помогите с async
8 сообщений из 8, страница 1 из 1
Помогите с async
    #39849789
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Есть код в форме
Код: c#
1.
2.
3.
4.
5.
private async Task UsersRefresh()
{
	var x=db_func.GetUsers();
	dgvUsers.DataSource =x;
}


методо в классе db_func
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public async Task<List<User>> GetUsersAsync()
        {
            List<User> ulist = new List<User>();
            DataTable dt = await SelectAsync("select_users", null);
            foreach (var dr in dt.Select())
            {
                ulist.Add(new User(new Guid(dr["user_id"].ToString()), dr["user_name"].ToString()));;
            }
            return ulist;
        }


и метод SelectAsync, котрый обращается к базе постгре
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
public async static Task<DataTable> SelectAsync(string procname, NpgsqlParameterList param = null)
        {
            var table = new DataTable();
            if (pg.IsConnect)
            {
                try
                {
                    using (NpgsqlCommand command = conn.CreateCommand())
                    {
                        command.CommandText = procname;
                        command.CommandType = CommandType.StoredProcedure;
                        if (param != null)
                            command.Parameters.AddRange(param.ToArray());
                        var reader = await command.ExecuteReaderAsync();
                        for (int i = 0; i < reader.FieldCount; i++)
                            table.Columns.Add(reader.GetName(i));
                        while (await reader.ReadAsync())
                        {
                            var row = table.NewRow();
                            for (int i = 0; i < reader.FieldCount; i++)
                                row[i] = reader[i];
                            table.Rows.Add(row);
                        }
                    }
                }
                catch (NpgsqlException e)
                {
                    e.Handle();
                }
            }
            return table;
        }


Метод UsersRefresh вызывается, грид заполняется, срабатывает асинхронно, но при попытке вызывать его повторно, например через 5 сек, выкидывается исключение драйвером Npgsql что команда уже используется. Здесь сам коннекшен conn является постоянным открытым. Вроде команда завершилась и отдала результаты, почему ошибка не понятно. Если переделать метод чтобы конекшен открывался непосредственно перед запросом - понятно, наверно сработает. Интересно почему не работает в таком виде?
...
Рейтинг: 0 / 0
Помогите с async
    #39849791
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
var x=db_func.GetUsers();
следует читать
var x=db_func.GetUsersAsync();
...
Рейтинг: 0 / 0
Помогите с async
    #39849799
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kolu4ka, ну так не держите коннекцию открытой...? бага в провайдере? Недофетченый набор? C# Winforms Npgsql 3.0.5 “An operation already in progress” error when trying to run multiple commands inside same connection
...
Рейтинг: 0 / 0
Помогите с async
    #39849843
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buser, набор в гриде полный отображается. И синхронная версия такого кода при открытом коннекте работает без ошибок. Ну если это такой баг...
...
Рейтинг: 0 / 0
Помогите с async
    #39849846
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а где в UsersRefresh await?
вы пытаетесь присвоить к dgvUsers.DataSource Task<DataTable>, а не DataTable...
...
Рейтинг: 0 / 0
Помогите с async
    #39849863
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtesвы пытаетесь присвоить к dgvUsers.DataSource Task<DataTable>, а не DataTable...
Нет, там присваивается List<User>.

buser
Спасибо за ссылку, получше почитала. добавила reader.Dispose() в SelectAsync и все заработало!
...
Рейтинг: 0 / 0
Помогите с async
    #39849873
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtesа где в UsersRefresh await?
вы пытаетесь присвоить к dgvUsers.DataSource Task<DataTable>, а не DataTable...
Прошу прощения, перепутала и запостила синхронный кусок, асинхронный выглядел так
Код: c#
1.
2.
3.
4.
5.
private async Task UsersRefresh()
        {
            var x = await db_func.GetAppUsersAsync();
            dgvUsers.DataSource = x;
        }
...
Рейтинг: 0 / 0
Помогите с async
    #39850233
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Kolu4ka]Roman MejtesСпасибо за ссылку, получше почитала. добавила reader.Dispose() в SelectAsync и все заработало!Надо было его просто в using заключить. Обычно DataReader в using объявляют а не Command.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Помогите с async
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]